python指定したプロセスウィンドウにフォーカスをロックする参照方法
4569 ワード
pythonを使用すると、多くのウィンドウが開き、プロセスのウィンドウにフォーカスをロックしてから、ウィンドウを操作する必要がある場合があります.例えばnotepadを開きましたexeとwordpad.exeアプリケーションは、notepadウィンドウに焦点を当て、notepadウィンドウに入力する必要があります.
参照コードは、notepadのため、プロセスのpidを取得することによって、そのプロセスの下のすべてのウィンドウを巡回する原理である.exeにはウィンドウが1つしかないので、ウィンドウのハンドルが1つ得られます.win 32 guiのSetForegroundWindow(hwnd)を呼び出し、そのhwndを頭に置きます.
HwndWrapperクラスにSetFocus関数があるpywinautoライブラリを使用します.この関数は、実際には失効する場合があります.SetFocus関数を変更して、最初に次のコードを実行します.
異常が発生した場合は、元の内容を続行します.
参照コードは、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)
異常が発生した場合は、元の内容を続行します.