#include "enum_process64.idx" #include #include #include ' ↓ ここからプログラムが実行されます ' EnumWindowsProcコールバック関数 Function FindWindowProc(hwnd As HWND, lParam As LPARAM) As BOOL Set_LONG_PTR(lParam As VoidPtr,hwnd As Int64) FindWindowProc=FALSE '列挙を中断 End Function Sub main(lpszCmdLine As LPSTR) Dim temporary[MAX_PATH] As Byte, temp2[1024] As Byte Dim lpszBuffer As LPSTR lpszBuffer=calloc(1) Dim szAppPath[MAX_PATH] As Byte GetModuleFileName(GetModuleHandle(0),szAppPath,MAX_PATH) Dim pdwProcessId As *DWord pdwProcessId=malloc(8192*SizeOf(DWord)) 'プロセスを列挙 Dim cbNeeded As DWord EnumProcesses(pdwProcessId,8192*sizeof(DWORD),cbNeeded) Dim i As Long For i=0 To ELM(cbNeeded/SizeOf(DWord)) 'プロセスIDを元にハンドルを取得 Dim hProcess As HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,pdwProcessId[i]) If hProcess=0 Then Continue 'そのプロセスにおける実行モジュールのインスタンスハンドルを取得 Dim hModule As HINSTANCE Dim cbReturned As DWord If EnumProcessModules(hProcess, VarPtr(hModule), sizeof(HINSTANCE), cbReturned )=0 Then Continue '実行ファイル名を取得 GetModuleFileNameEx(hProcess,hModule,temporary,MAX_PATH) Dim bWow64 As BOOL Dim lpszPlatform As LPSTR IsWow64Process(hProcess,bWow64) If bWow64 Then lpszPlatform="Win32" Else lpszPlatform="Win64" End If '------------------------------ ' ウィンドウタイトルを取得 '------------------------------ 'スナップショットを取得 Dim hSnapshot As HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0) Dim te As THREADENTRY32 FillMemory(VarPtr(te),SizeOf(THREADENTRY32),0) te.dwSize=SizeOf(THREADENTRY32) If Thread32First(hSnapshot,te) Then Do If te.th32OwnerProcessID=pdwProcessId[i] Then Exit Do End If Loop While Thread32Next(hSnapshot,te) End If Dim hwnd As HWND hwnd=0 EnumThreadWindows(te.th32ThreadID,AddressOf(FindWindowProc),VarPtr(hwnd) As LPARAM) While GetParent(hwnd) hwnd=GetParent(hwnd) Wend Dim szWndTitle[1024] As Byte szWndTitle[0]=0 If hwnd Then GetWindowText(hwnd,szWndTitle,1024) CloseHandle(hSnapshot) CloseHandle(hProcess) '自分自身は無視 If lstrcmpi(temporary,szAppPath)=0 Then Continue End If '-------------------- ' バッファへ追加 '-------------------- wsprintf(temp2,Ex"\q%s\q,%d,%s,%s\r\n",temporary,pdwProcessId[i],lpszPlatform,szWndTitle) lpszBuffer=realloc(lpszBuffer,lstrlen(lpszBuffer)+lstrlen(temp2)+1) lstrcat(lpszBuffer,temp2) Next free(pdwProcessId) '----------------------- ' ファイルへ保存 '----------------------- _splitpath(szAppPath,temporary,temp2,NULL,NULL) lstrcat(temporary,temp2) lstrcat(temporary,"list.dat") Dim hFile As HANDLE hFile=CreateFile(temporary,GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,0,0) Dim dwAccBytes As DWord WriteFile(hFile,lpszBuffer,lstrlen(lpszBuffer),VarPtr(dwAccBytes),ByVal 0) CloseHandle(hFile) free(lpszBuffer) End Sub main(PathGetArgs(GetCommandLine()))