您的位置:

全能编程开发工程师必备技能: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平台开发有着重要的意义。