pywinauto 包使用
pywinauto 是什么?
pywinauto 是一个自动化图形用户界面 (GUI) 的库,主要用于Windows应用程序。在 pywinauto 中,Desktop 和 Application 是两个核心类,它们各自有不同的用途和使用场景。
backend 选择
我们安装好 Pywinauto 之后,首先要确定哪种可访问性技术(backend)可以用于我们的应用程序,在 windows 上受支持的有两种:
- Win32 API
(backend= "win32")默认的 backend 主要支持 MFC、VB6、VCL、简单的 WinForms 控件和大多数旧的遗 留应用程序 - MS UI Automation
(backend="uia")支持 WinForms、WPF、商店应用程序、QT5、浏览器

常用的一些元素定位工具:
- SPY++:用于 WIN32 API,当 SPY++ 可以显示所有的控件时,访问技术应该选择 "win32"。
- Inspect.exe:如果
Inspect.exe的模式设置为 UIA 模式,可以比 SPY++ 显示更多的控件,则访问技术应该选择"uia"。 - py_inspect:支持 win32 和 uia 两种访问技术,是SWAPY的替代。
- UISPY:支持 uia 访问技术。
- SWAPY:只支持win32访问技术。
Desktop 类
Desktop 类代表整个桌面,允许你访问和操作桌面上的所有窗口,包括非特定应用程序的窗口。Desktop 类非常适合于需要对多个应用程序或系统级窗口进行操作的场景。
使用 Desktop 类的常见场景包括:
- 查找和操作桌面上的窗口,不限于特定应用程序。
- 执行跨多个应用程序的自动化任务。
- 获取当前活动窗口或桌面上的所有窗口列表。
示例:获取桌面上所有窗口的标题
from pywinauto import Desktop
desktop = Desktop(backend="uia")
windows = desktop.windows()
# 打印所有窗口的标题
for w in windows:
print(w.window_text())
Application 类
Application 类用于启动和控制一个特定的应用程序。你可以使用 Application 类来启动一个新的应用程序实例,或者连接到一个已经运行的应用程序。一旦连接到应用程序,你可以通过 Application 对象来操作应用程序窗口和控件,执行各种自动化任务。
使用 Application 类的常见场景包括:
- 启动一个新的应用程序实例。
- 连接到一个已经运行的应用程序。
- 操作应用程序的窗口和控件,如按钮点击、文本输入、菜单选择等。
示例:启动和控制记事本应用程序
from pywinauto import Application
# 启动记事本应用程序
app = Application(backend="uia").start("notepad.exe")
# 通过窗口标题选择主窗口
main_window = app.window(title='无标题 - 记事本')
# 在记事本中输入文本
main_window.Edit.type_keys("Hello, pywinauto!", with_spaces=True)
WindowSpecification 类
WindowSpecification 它是 pywinauto API 的一个核心概念。WindowSpecification 对象并非真正的窗口或控件,而是一组描述窗口或控件的条件。所以当你创建一个 WindowSpecification 对象时,它并不立即寻找窗口或控件。只有在实际进行操作(如点击或输入)时,才会解析并定位目标元素。这种 “惰性求值” 可以提高脚本的灵活性和效率。
可以看这个 WindowSpecification 的 __getattribute__ 方法, 它会在遇到未定义的属性时,去根据 WindowSpecification 包含的这组描述窗口或控件的条件,去寻找匹配的窗口或控件。