2017-09-16 63 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的例子吗? –