2015-06-21 24 views
3

我使用下面的代碼來確定前臺窗口並找到創建它的.exe文件的路徑。發現python中所有窗口的exe路徑

hwnd = win32gui.GetForegroundWindow() 
_, pid = win32process.GetWindowThreadProcessId(hwnd) 
hndl = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, 0, pid) 
path = win32process.GetModuleFileNameEx(hndl, 0) 
print path 

這workd對諸如谷歌Chrome,PyCharm,Filezilla的等窗口,但行

path = win32process.GetModuleFileNameEx(hndl, 0) 

拋出錯誤

pywintypes.error: (299, 'GetModuleFileNameEx', 'Only part of a ReadProcessMemory or WriteProcessMemory request was completed.') 

的Windows資源管理器,計算器,命令提示符等

我相對較新的編碼和python和不能找出爲什麼這是這種情況,還有什麼區別。

回答

1

該錯誤表明您正在64位Windows上的WOW64仿真器中執行32位代碼,並嘗試獲取有關64位進程的信息。

爲了解決這個問題,您應該切換到運行64位代碼。所以,你需要64位的Python。

+0

自引入受保護進程以來,首選使用'PROCESS_QUERY_LIMITED_INFORMATION'和'QueryFullProcessImageName'。即使管理員啓用了「SeDebugPrivilege」,系統也不會授予PROCESS_QUERY_INFORMATION訪問受保護的進程的權限。這也應該可以用來從WOW64進程中查詢一個本地的64位進程。 – eryksun

0

您可以使用psutil模塊獲取路徑。

hwnd = win32gui.GetForegroundWindow() 
_, pid = win32process.GetWindowThreadProcessId(hwnd) 
path = psutil.Process(pid).exe()