pywinauto 介绍
目录
1、简介
pywinauto 是 Windows 桌面 GUI 自动化库,底层调用 Win32 API / UIA(UI Automation)。
✅ 核心优势:控件识别,不是像素坐标,窗口位置挪动不影响;可以读取控件文本;窗口最小化部分场景仍可操作。
❌ 限制:仅支持 Windows;纯自研渲染界面(部分 Electron、游戏)没有控件树,识别失败,这时需要搭配 pyautogui 识图兜底。
两种后端:
-backend="uia"`:现代软件,推荐(新版 WPF、Qt、Electron、记事本、浏览器)
-backend="win32"`:老式 MFC、VB6 程序
安装
pip install pywinauto
基础初始化两种方式
from pywinauto import Application
# 方式1:启动新程序 start()
app = Application(backend="uia").start("notepad.exe")
# 方式2:连接已经打开的程序 connect(),常用
app = Application(backend="uia").connect(title="记事本", timeout=5)
win = app.window(title="记事本")
小工具:`Inspect.exe` /Accessibility Insights for Windows` 查看控件属性(title、class_name、automation_id)
2、窗口操作
from pywinauto import Application
app = Application(backend="uia").connect(title="记事本")
win = app.window(title="记事本")
win.wait("exists", timeout=5) # 等待窗口存在
win.wait("visible", timeout=5) # 等待窗口可见
win.minimize() # 最小化
win.restore() # 还原
win.maximize() # 最大化
win.set_focus() # 激活窗口置顶
win.close() # 关闭窗口
# 获取窗口坐标
rect = win.rectangle()
print(rect.left, rect.top, rect.width(), rect.height())
3、控件查找、判断元素是否存在(高频)
app = Application(backend="uia").connect(title="记事本")
win = app.window(title="记事本")
# 查找编辑框控件
edit = win.Edit
# 判断控件是否存在,exists() 不会阻塞
if edit.exists(timeout=1):
print("编辑框存在")
else:
print("编辑框不存在")
# 等待控件出现
edit.wait("visible", timeout=3)
4、输入文本、读取控件文本
app = Application(backend="uia").connect(title="记事本")
win = app.window(title="记事本")
edit = win.Edit
# 输入内容
edit.type_keys("hello pywinauto 测试")
# 读取控件文字
text = edit.text()
print("文本内容:", text)
# type_keys 支持按键:{ENTER} {TAB} {CTRL A}
edit.type_keys("{CTRL A}") # 全选
edit.type_keys("{DELETE}") # 删除
5、 点击控件(普通点击 + 控件内相对坐标点击)
app = Application(backend="uia").connect(title="记事本")
win = app.window(title="记事本")
# 普通点击控件
win.Button.click()
# 在控件内部相对坐标点击:左上角偏移(x,y)
# coords=(x,y) 相对于控件左上角,不是屏幕坐标
win.Button.click(coords=(10,5))
6、菜单操作
# 记事本 点击 文件 -> 另存为
app = Application(backend="uia").connect(title="记事本")
win = app.window(title="记事本")
win.menu_select("文件 -> 另存为")
7、弹窗等待
app = Application(backend="uia").connect(title="记事本")
win = app.window(title="记事本")
try:
dlg = app.window(title="另存为")
dlg.wait("visible", timeout=3)
dlg.Cancel.click()
except Exception as e:
print("弹窗未出现")
8、遍历多个控件
# 获取窗口下所有子控件
childs = win.children()
for ctrl in childs:
print(ctrl.window_text())
9、完整可运行 Demo:记事本自动化流程
from pywinauto import Application
import time
# 启动记事本
app = Application(backend="uia").start("notepad.exe")
win = app.window(title="无标题 - 记事本")
win.wait("visible", timeout=5)
# 获取编辑框
edit = win.Edit
# 输入文字
edit.type_keys("pywinauto demo 演示")
time.sleep(1)
# ctrl+a全选
edit.type_keys("{CTRL A}")
time.sleep(1)
# 删除
edit.type_keys("{DELETE}")
time.sleep(1)
# 重新输入
edit.type_keys("测试完成")
# 关闭记事本
win.close()
10、常用异常 & 坑点
1.backend` 选错会找不到控件;现代软件优先uia`
2.title` 要完全匹配,中文注意空格;也可以用title_re` 正则匹配
# 正则匹配窗口标题,不用写完整
app.window(title_re=".*记事本.*")
3. 部分软件高 DPI 会导致控件识别异常,可以系统关闭高 DPI 缩放
4. 控件名找不到:用 Accessibility Insights 查看控件`AutomationId`,用这个定位最稳
win.child_window(automation_id="xxx").click()
5. pywinauto 控件定位优先,尽量不要用屏幕绝对坐标,稳定性差
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:pywinauto 介绍
本文作者:伟生
发布时间:2026-10-18, 21:01:00
最后更新:2026-10-18, 21:09:38
原始链接:http://yoursite.com/2026/10/18/basic_23_pywinauto/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。