一、win32gui.FindWindow 模糊
import win32gui hwnd = win32gui.FindWindow(None, "筆記本") print(hwnd)
這段代碼的作用是查找應用程序為「筆記本」的窗口句柄。其中,第一個參數為類名,為None時表示忽略此參數;第二個參數為窗口標題。此時的查找方式為「精確匹配」,結果為窗口的句柄。如果沒有找到窗口,則返回0。
可以發現,「精確匹配」有時並不能滿足我們的需求,因此我們需要模糊匹配。
比如,我們想查找所有標題以「記事本」開頭的窗口:
import win32gui import re def enum_windows_proc(hwnd, lParam): if re.match("記事本.*", win32gui.GetWindowText(hwnd)): print(hwnd) win32gui.EnumWindows(enum_windows_proc, None)
上述代碼中,我們定義了一個枚舉函數,遍歷所有窗口並篩選出符合條件的窗口。GetWindowText獲取窗口標題,再用re.match進行匹配。最終輸出的就是所有標題以「記事本」開頭的窗口句柄。
二、win32gui.FindWindow 筆記本
import win32gui hwnd = win32gui.FindWindow("Notepad", None) print(hwnd)
這段代碼的作用是查找類名為「Notepad」的窗口句柄。第一個參數為類名,「精確匹配」模式。如果沒有找到窗口,則返回0。
三、win32gui.FindWindowex模糊匹配
import win32gui import win32con def enum_windows_proc(hwnd, lParam): if win32gui.GetClassName(hwnd) == "Notepad" and win32gui.GetWindowText(hwnd) == "新建文本文檔": lParam.append(hwnd) hwndChildList = [] win32gui.EnumChildWindows(win32gui.GetDesktopWindow(), enum_windows_proc, hwndChildList) for hwnd in hwndChildList: print(hwnd)
上面的代碼在FindWindow的基礎上,增加了遍歷子窗口的功能。等同於FindWindowEx(hWndParent, None, None, None)。第一個參數是父窗口的句柄,為None時表示從頂層窗口開始查找;第二個參數是子窗口類名,為None時表示忽略此參數;第三個參數是子窗口標題,為None時表示忽略此參數;第四個參數是查找方式,為None時表示默認查找方式。
上述代碼中,我們定義了一個枚舉函數,篩選符合條件的子窗口(類名為「Notepad」,標題以「新建文本文檔」開頭),並將它們的句柄存入一個列表中。
四、win32gui.FindWindowex 模糊
import win32gui import win32con hwndParent = win32gui.FindWindow(None, "新建文本文檔 - 記事本") hwndChild = win32gui.FindWindowEx(hwndParent, None, None, None) print(hwndChild)
這段代碼的作用是查找父窗口標題為「新建文本文檔 – 記事本」的窗口句柄,然後再在父窗口下查找第一個子窗口,查找方式為「模糊匹配」。FindWindowEx會返回句柄最小的子窗口句柄,如果沒有找到符合條件的窗口,則返回0。
五、win32gui.FindWindowex查找多個
import win32gui import win32con def enum_child_windows_proc(hwnd, lParam): if win32gui.GetClassName(hwnd) == "Edit": lParam.append(hwnd) hwndParent = win32gui.FindWindow(None, "新建文本文檔 - 記事本") hwndChildList = [] win32gui.EnumChildWindows(hwndParent, enum_child_windows_proc, hwndChildList) for hwnd in hwndChildList: print(hwnd)
上面的代碼查找指定父窗口下所有Edit控件的句柄(多個)。前三個參數與前面的FindWindowEx相同,第四個參數設為None(默認查找方式),最後一個參數為存儲句柄的列表。
六、win32gui.FindWindow *記事本
import win32gui import win32con hwnd = win32gui.FindWindow("Notepad*", None) print(hwnd)
這段代碼與FindWindow的第一個參數為「Notepad」不同在於使用了”*”代替後綴(或完全匹配)。這樣可以模糊查找類名以「Notepad」開頭的窗口句柄。
七、win32gui.FindWindowEx等於0
import win32gui import win32con hwndParent = win32gui.FindWindow(None, "新建文本文檔 - 記事本") hwndChild = win32gui.FindWindowEx(hwndParent, None, None, None) hwndChild = win32gui.FindWindowEx(hwndParent, hwndChild, None, None) print(hwndChild)
這段代碼演示了一種查找子窗口的「方法」,就是不斷通過上一個子窗口句柄查找下一個子窗口。這樣就不用關心當前窗口的類名和標題,只需要保證父窗口不變就可以查找到子窗口。如果沒有找到符合條件的子窗口,則返回0。
八、win32gui.FindWindowEx選取
import win32gui import win32con hwndParent = win32gui.FindWindow(None, "新建文本文檔 - 記事本") hwndChild = win32gui.FindWindowEx(hwndParent, None, "Edit", None) print(hwndChild)
這段代碼查找父窗口標題為「新建文本文檔 – 記事本」下第一個子窗口(類名為「Edit」)的句柄。第二個參數設為None,表示從第1個子窗口開始查找。如果沒有找到符合條件的子窗口,則返回0。
總結
win32gui.findwindow是一種常用的搜索窗口控件的方式。通過不同的參數組合,可以實現精確或模糊匹配,查找父窗口、子窗口等。在Win32編程中,使用win32gui.findwindow較為常見,因此,深入了解其用法對於Windows平台開發有着重要的意義。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/291550.html