python指定したプロセスウィンドウにフォーカスをロックする参照方法

4569 ワード

pythonを使用すると、多くのウィンドウが開き、プロセスのウィンドウにフォーカスをロックしてから、ウィンドウを操作する必要がある場合があります.例えばnotepadを開きましたexeとwordpad.exeアプリケーションは、notepadウィンドウに焦点を当て、notepadウィンドウに入力する必要があります.
参照コードは、notepadのため、プロセスのpidを取得することによって、そのプロセスの下のすべてのウィンドウを巡回する原理である.exeにはウィンドウが1つしかないので、ウィンドウのハンドルが1つ得られます.win 32 guiのSetForegroundWindow(hwnd)を呼び出し、そのhwndを頭に置きます.
 1 import win32con

 2 import win32gui

 3 import win32process

 4 

 5 def get_hwnds_for_pid (pid):

 6     def callback (hwnd, hwnds):

 7         if win32gui.IsWindowVisible (hwnd) and win32gui.IsWindowEnabled (hwnd):

 8             _, found_pid = win32process.GetWindowThreadProcessId (hwnd)

 9             if found_pid == pid:

10                 hwnds.append (hwnd)

11             return True

12     hwnds = []

13     win32gui.EnumWindows (callback, hwnds)

14     return hwnds

15 

16 if __name__ == '__main__':

17     import subprocess

18     import time

19     notepad = subprocess.Popen ([r"notepad.exe"])

20     #

21     # sleep to give the window time to appear

22     #

23     time.sleep (2.0)

24     print notepad.pid

25     for hwnd in get_hwnds_for_pid (notepad.pid):

26         print hwnd, "=>", win32gui.GetWindowText (hwnd)

27         win32gui.SetForegroundWindow(hwnd)

HwndWrapperクラスにSetFocus関数があるpywinautoライブラリを使用します.この関数は、実際には失効する場合があります.SetFocus関数を変更して、最初に次のコードを実行します.
1 ctypes.windll.user32.SwitchToThisWindow(self.handle,True)

2 win32functions.SetFocus(self)

異常が発生した場合は、元の内容を続行します.