python和pywin32实现窗口查找、遍历和点击的示例代

1. 简介

在编写自动化测试脚本时,常常需要对窗口进行查找、遍历和点击操作。Python是一种非常流行的编程语言,而pywin32是它的一个重要模块,提供了对Windows操作系统的访问。本文将介绍如何使用Python和pywin32实现窗口查找、遍历和点击操作的示例代码。

2. 安装pywin32模块

在使用pywin32模块之前,我们需要先安装它。在Windows中,可以通过pip来安装:

pip install pywin32

3. 查找窗口

在进行窗口遍历和点击操作前,需要先定位到需要操作的窗口。pywin32提供了一系列函数来获取窗口句柄,并且可以根据窗口标题、类名和父窗口句柄等信息来查找窗口。下面是一个查找窗口的示例代码:

import win32gui

# 定义回调函数,用于查找窗口

def find_window_handle(hwnd, window_list):

window_list.append(hwnd)

return True

def find_window_by_title(title):

window_list = []

win32gui.EnumWindows(find_window_handle, window_list)

for hwnd in window_list:

if title in win32gui.GetWindowText(hwnd):

return hwnd

return None

def find_window_by_class(classname):

window_list = []

win32gui.EnumWindows(find_window_handle, window_list)

for hwnd in window_list:

if win32gui.GetClassName(hwnd) == classname:

return hwnd

return None

title = "计算器"

hwnd = find_window_by_title(title)

if hwnd:

print(f"找到窗口:{title}")

else:

print(f"未找到窗口:{title}")

上面的代码通过枚举所有窗口,然后调用回调函数来获取所有窗口的句柄。在回调函数中,将窗口句柄添加到一个列表中,最终返回True。查找窗口时,遍历所有窗口句柄,根据窗口标题或类名来查找目标窗口。如果找到了目标窗口,返回它的句柄。如果没有找到,返回None。

4. 遍历窗口子控件

在查找到目标窗口后,需要遍历它的所有子控件,以便在后续的操作中获取它们的句柄。pywin32提供了一系列函数来获取窗口的子控件,包括获取指定窗口的第一个子控件、获取下一个兄弟控件等。下面是一个遍历窗口子控件的示例代码:

import win32gui

import win32api

def get_child_windows(hwnd):

if not hwnd:

return []

hwnd_list = []

win32gui.EnumChildWindows(hwnd, lambda hwnd, param: param.append(hwnd), hwnd_list)

return hwnd_list

def get_classname_by_hwnd(hwnd):

return win32gui.GetClassName(hwnd)

def get_window_text_by_hwnd(hwnd):

length = win32gui.GetWindowTextLength(hwnd)

buf = win32api.PyMakeBuffer(length+1)

win32gui.GetWindowText(hwnd, buf, length+1)

return buf.value.decode("gbk")

if hwnd:

child_hwnd_list = get_child_windows(hwnd)

for child_hwnd in child_hwnd_list:

classname = get_classname_by_hwnd(child_hwnd)

text = get_window_text_by_hwnd(child_hwnd)

print(f"子控件,句柄:{child_hwnd} 类名:{classname} 文本:{text}")

上面的代码中,get_child_windows函数用来获取指定窗口的所有子控件句柄,它通过调用EnumChildWindows函数实现。EnumChildWindows函数接受三个参数,第一个参数是需要枚举子控件的父窗口句柄,第二个参数是一个回调函数,用来处理每个找到的子控件,第三个参数指向一个传递给回调函数的参数。在回调函数中,将子控件句柄添加到一个列表中,最终返回True。get_classname_by_hwnd函数用来获取指定窗口的类名,get_window_text_by_hwnd函数用来获取指定窗口的文本信息。

5. 点击窗口控件

在遍历到需要进行操作的窗口子控件后,可以通过模拟鼠标点击事件来实现对控件的自动化操作。pywin32提供了一些函数来模拟鼠标事件,如鼠标左键按下、鼠标左键抬起等。下面是一个点击按钮的示例代码:

import win32api

import win32con

def click_button_by_hwnd(hwnd):

left, top, right, bottom = win32gui.GetClientRect(hwnd)

x = left + int((right - left) / 2)

y = top + int((bottom - top) / 2)

win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, 1, win32api.MAKELONG(x, y))

win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, win32api.MAKELONG(x, y))

if hwnd:

child_hwnd_list = get_child_windows(hwnd)

for child_hwnd in child_hwnd_list:

classname = get_classname_by_hwnd(child_hwnd)

if classname == "Button":

click_button_by_hwnd(child_hwnd)

上面的代码中,click_button_by_hwnd函数用来模拟点击指定句柄的按钮控件。首先调用GetClientRect函数来获取按钮控件的坐标范围,并计算出按钮的中心坐标。然后依次调用SendMessage函数来发送鼠标左键按下、抬起等事件,从而完成对按钮的自动化点击操作。

6. 总结

本文介绍了使用Python和pywin32模块实现窗口查找、遍历和点击的示例代码。通过使用pywin32提供的函数,可以方便地实现自动化测试脚本中对Windows窗口的操作。读者可以根据自己的需求,进一步扩展上面的示例代码,实现更多的自动化操作。

后端开发标签