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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏