【Pywinauto库】8.3 pywinauto.findwindows 模块
概述
pywinauto.findwindows
提供用于迭代和查找窗口/元素的函数,是 pywinauto 的核心查找功能模块。
异常类
ElementAmbiguousError
当有不止一个元素匹配时抛出的异常。
ElementNotFoundError
当找不到元素时抛出的异常。
WindowAmbiguousError
当不止一个窗口匹配时抛出的异常。
WindowNotFoundError
当找不到窗口时抛出的异常。
主要函数
enum_windows()
返回所有顶级窗口的句柄列表。
示例:
from pywinauto.findwindows import enum_windowsall_windows = enum_windows()
print(f"找到 {len(all_windows)} 个顶级窗口")
find_element(**kwargs)
调用 find_elements
并确保只返回一个元素。
特点:
- 使用与
find_elements
完全相同的参数 - 如果找到多个匹配元素,抛出
ElementAmbiguousError
- 如果找不到匹配元素,抛出
ElementNotFoundError
示例:
from pywinauto.findwindows import find_element# 查找特定的记事本窗口
notepad_window = find_element(title="无标题 - 记事本", class_name="Notepad")
find_elements(**kwargs)
根据传入的标准查找元素。
警告: 不建议直接使用此功能!这是一个非常低级的API。更好的方式是使用"入门指南"中描述的 Application
和 WindowSpecification
对象。
参数:
参数 | 描述 | 默认值 |
---|---|---|
class_name | 具有此窗口类的元素 | None |
class_name_re | 类与此正则表达式匹配的元素 | None |
parent | 元素是此的子元素 | None |
process | 在此过程中运行的元素 | None |
title | 有这个文字的元素 | None |
title_re | 文本与此正则表达式匹配的元素 | None |
top_level_only | 仅限顶级元素 | True |
visible_only | 仅可见元素 | True |
enabled_only | 仅启用元素 | False |
best_match | 标题与此类似的元素 | None |
handle | 要返回的元素的句柄 | None |
ctrl_index | 要返回的子元素的索引 | None |
found_index | 要返回的已过滤子元素的索引 | None |
predicate_func | 用户为自定义元素验证提供的钩子函数 | None |
active_only | 仅限活动元素 | False |
control_id | 具有此控件ID的元素 | None |
control_type | 具有此控件类型的元素(字符串,用于UIAutomation元素) | None |
auto_id | 具有此自动化ID的元素(用于UIAutomation元素) | None |
framework_id | 具有此框架ID的元素(用于UIAutomation元素) | None |
backend | 搜索时使用的后端名称 | None |
depth | 搜索深度 | None |
示例:
from pywinauto.findwindows import find_elements# 查找所有可见的记事本窗口
notepad_windows = find_elements(class_name="Notepad", visible_only=True)# 使用正则表达式查找标题包含"记事本"的窗口
notepad_like_windows = find_elements(title_re=".*记事本.*")# 查找特定进程的窗口
specific_process_windows = find_elements(process=1234)
find_window(**kwargs)
调用 find_elements
并确保只返回一个元素的句柄。
特点:
- 使用与
find_elements
完全相同的参数 - 返回单个窗口句柄而不是元素对象
示例:
from pywinauto.findwindows import find_window# 查找记事本窗口句柄
notepad_handle = find_window(title="无标题 - 记事本", class_name="Notepad")
find_windows(**kwargs)
根据传入的条件查找元素并返回其句柄列表。
特点:
- 使用与
find_elements
完全相同的参数 - 返回窗口句柄列表而不是元素对象列表
示例:
from pywinauto.findwindows import find_windows# 查找所有记事本窗口句柄
notepad_handles = find_windows(class_name="Notepad")
使用示例
基本查找示例
from pywinauto.findwindows import find_elements, find_element# 查找所有可见的顶级窗口
all_visible_windows = find_elements(visible_only=True, top_level_only=True)# 精确查找特定窗口
specific_window = find_element(title="计算器", class_name="ApplicationFrameWindow")
使用正则表达式
from pywinauto.findwindows import find_elements# 使用正则表达式匹配标题
chrome_windows = find_elements(title_re=".*Chrome.*")# 使用正则表达式匹配类名
button_controls = find_elements(class_name_re=".*Button.*")
处理异常
from pywinauto.findwindows import find_element, ElementNotFoundError, ElementAmbiguousErrortry:window = find_element(title="不存在的窗口")
except ElementNotFoundError:print("找不到指定的窗口")
except ElementAmbiguousError:print("找到多个匹配的窗口,请使用更精确的条件")
使用自定义谓词函数
from pywinauto.findwindows import find_elementsdef custom_filter(element):# 自定义过滤逻辑return element.visible and element.enabled and hasattr(element, 'specific_property')# 使用自定义过滤函数
filtered_elements = find_elements(predicate_func=custom_filter)
注意事项
- 性能考虑:
find_elements
是相对低级的API,频繁调用可能影响性能 - 推荐用法: 建议使用高级的
Application
和WindowSpecification
接口 - 错误处理: 总是准备好处理可能抛出的异常
- 参数组合: 可以组合多个参数来精确查找目标元素
- 后端兼容: 注意不同后端(win32/uia)可能支持不同的参数