我想獲得有可視窗口的進程的名稱。例如,如果我打開了Chrome瀏覽器,我希望獲得字符串「chrome.exe」,但是我只使用下面的代碼獲取init值「unknown」。如何獲取具有可見窗口的任何進程的名稱 - WinAPI?
我讀過它可能是一個訪問權限問題,你能否告訴我如何改變它們以獲取進程的名稱?
DWORD idProc = 0; //pointer to the process which created the window
DWORD idThread = GetWindowThreadProcessId(Wnd->get_handle(), &idProc);
Wnd->set_pid(idThread); //Wnd is an object of a class i created, to collect processes info
// Get a handle to the process.
TCHAR szProcessName[DEFAULT_BUFLEN] = TEXT("<unknown>");
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, idProc);
if (hProcess!=NULL) {
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod),
&cbNeeded))
{
GetModuleBaseName(hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR));
}
}
Wnd->set_processname(szProcessName);
CloseHandle(hProcess);
它工作正常的一些過程,但它不確實爲許多其他類似的Chrome,就像我說的。
編輯:我忘了說,我剛過濾可見的窗口,所以假設手柄是我需要的。
您需要添加錯誤檢查,這樣就可以告訴哪個呼叫失敗。 –
https://wj32.org/wp/2010/03/30/get-the-image-file-name-of-any-process-from-any-user-on-vista-and-above/ – RbMm
好的,首先感謝您的答案。我添加了一些std :: cout << GetLastError,並且在EnumProcessModules中出現了錯誤299。 搜索了它,ERROR_PARTIAL_COPY 299(0x12B) 只有部分ReadProcessMemory或WriteProcessMemory請求已完成。 – Serusar