我在寫一個Windows(MS)應用程序以獲取活動窗口的進程的名稱。不同的機器和操作系統的應用程序行爲不同
在運行32位Windows XP Professional的臺式PC上,應用程序按預期運行。但是在配備64位Windows 7 Professional操作系統的筆記本電腦上,該功能無法按預期工作。對於某些進程,返回無效句柄。在運行Windows 8.1 64位的ultrabook上,我獲得了相同的結果。
相關的代碼片段如下:
DWORD dwThreadID, dwProcessID;
GUITHREADINFO gti;
HANDLE hProcess;
char szProcessFileName[MAX_PATH] = {0};
gti.cbSize = sizeof(GUITHREADINFO);
GetGUIThreadInfo(0, >i);
dwThreadID = GetWindowThreadProcessId(gti.hwndActive, &dwProcessID);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);
// Get the name of the process (no error checking for brevity)
GetModuleFileNameEx(hProcess, NULL, szProcessFileName, MAX_PATH);
當應用程序在非Windows XP操作系統上運行,如上文所述,對於某些工藝OpenProcess
和GetModuleFileNameEx
失敗。 GetModuleFileNameEx
通常失敗,ERROR_PARTIAL_COPY(錯誤代碼:299)或ERROR_INVALID_PARAMETER(錯誤代碼:87),而OpenProcess
失敗ERROR_INVALID_HANDLE(錯誤代碼:6)
不知道發生了什麼事情。任何幫助是極大的讚賞。我想知道它是否與用戶權限有關。
源代碼在運行Windows 7 Pro x64的64位機器上編譯爲32位應用程序。
re paths:我注意到用'GetProcessImageFileName' – XerZetZip 2014-11-08 04:56:11
是的,它試圖告訴你,它只將64位地址的一半複製到該32位存儲區。有關詳細信息,請參閱上面的文章鏈接「this」。 – 2014-11-08 05:25:52