全能編程開發工程師必備技能:win32gui.findwindow詳細解析

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 14:16
下一篇 2024-12-25 14:06

相關推薦

發表回復

登錄後才能評論