2017-09-16 62 views
0

我想設置一個程序(已知的PID)的頂部/活動/前景(不知道哪個是最合適的)。從PID設置活動/前景窗口

的PID被設置爲Windows進程PID

handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, 
         False, pid) 
    win32gui.SetForegroundWindow(handle) 
    win32gui.SetActiveWindow(handle) 

我要麼得到:

pywintypes.error: (1400, 'SetForegroundWindow', 'Invalid window Handle.') 

    pywintypes.error: (1400, 'SetActiveWindow', 'Invalid window handle.') 

我意識到這是在處理一個問題,但林不知道我應該如何正確地得到工作手柄。

回答

2

這項工作可以通過pywinauto做到:

from pywinauto import Application 
app = Application().connect(process=<pid>) 
app.top_window().set_focus() 

但它可能不是最小化應用工作。

1

OpenProcess功能:

如果函數成功,則返回值是一個開放句柄到指定process.and可以在需要的句柄的處理功能的任何使用。

SetForegroundWindow功能:它

參數是一個句柄應該被激活並帶到前臺的窗口。

所以你需要一個翻譯是這樣的:

HWND h = ::GetTopWindow(0); 
while (h) 
{ 
    DWORD pid; 
    DWORD dwTheardId = ::GetWindowThreadProcessId(h,&pid); 
     if (pid == /*your process id*/) 
     { 
       // here h is the handle to the window 
       break; 
     } 
     h = ::GetNextWindow(h , GW_HWNDNEXT); 
} 

一個Python版本:

def find_window_for_pid(pid): 
    result = None 
    def callback(hwnd, _): 
     nonlocal result 
     ctid, cpid = win32process.GetWindowThreadProcessId(hwnd) 
     if cpid == pid: 
      result = hwnd 
      return False 
     return True 
    win32gui.EnumWindows(callback, None) 
    return result 

一些注意事項:

但請注意,這很容易失敗,因爲當你首先啓動該過程,直到幾毫秒後它纔可能沒有窗口。如果父母和孩子之間沒有同步手段,那麼真的沒有辦法解決這個問題。 (你可以通過休眠一秒鐘來破解它,但是這與任何嘗試睡眠而不是同步的嘗試都是相同的問題 - 大多數情況下,它會太長,會降低代碼的響應性/性能沒有理由,偶爾當計算機忙時,它會太短而失敗。)

真正解決這個問題的唯一方法是使用pywin32來創建進程而不是使用標準的Python代碼。然後你有一個處理過程。這意味着您可以等待孩子開始其窗口循環,然後枚舉該進程的窗口。

+0

你有python的例子嗎? –