是的,PyWinAuto 完全支持中文。

PyWinAuto 本身是基于 Windows 的 UI 自动化 API(UIA)和 Win32 API 构建的,它对字符集的兼容性取决于以下两个关键因素:
- 底层 API 支持:Windows 的 UI 自动化框架原生支持 Unicode(包括中文),无论是窗口标题、按钮文本、输入框内容,还是控件名称,只要 Windows 能正确显示中文,PyWinAuto 就能识别和操作。
- Python 字符串处理:PyWinAuto 在 Python 3 中默认使用 Unicode 字符串,因此直接传入中文字符串(如
"确定"、"文件")即可。
具体操作场景及注意事项
识别中文标题的窗口或控件
最常用的方法是使用 window_text 或通过属性匹配,中文标题需要完全匹配或使用正则表达式。
import pywinauto
from pywinauto import Application
app = Application(backend="uia").start("notepad.exe")
# 方法1:直接使用中文字符串(适用于标题完全匹配)
dlg = app.window(title="无标题 - 记事本")
# 方法2:使用正则表达式(部分匹配、模糊匹配)
dlg = app.window(title_re=".*记事本.*")
# 方法3:通过控件类型和名称匹配(例如点击中文按钮)
dlg = app.window(title="无标题 - 记事本")
edit = dlg.child_window(auto_id="15", control_type="Edit")
edit.type_keys("你好,世界!")
# 点击中文菜单
dlg.menu_select("文件(F)->另存为(A)...")
在不同 Backend(后端)下的表现
- UIA (UI Automation):推荐用于现代 Windows 应用(如 WPF、WinForms、UWP、浏览器等),它对中文支持最好,能准确返回控制文本、Name、AutomationId 等属性。
- Win32 (Win32 API):用于传统 Win32 应用,它也能处理中文,但某些控件的文本获取可能不如 UIA 稳定,如果遇到中文乱码或无法选中,可以尝试切换到 UIA 后端。
常见的坑及解决方案
- 编码问题(Python 2 已淘汰,基本无影响):如果你还在使用 Python 2,需要在脚本头声明
# -*- coding: utf-8 -*-,但强烈建议使用 Python 3。 - 空格或全/半角符号中常含有全角空格、特殊符号(如、),如果匹配失败,请使用正则表达式
re.compile忽略空格或模糊匹配。import re # 假设窗口标题是“设置 - 系统·高级” dlg = app.window(title_re=re.compile(r".*设置.*系统.*"))
- 进程/窗口未激活:确保弹出的中文窗口已经在前台或已经加载完成,可以使用
dlg.wait('visible', timeout=5)等待。 - 控制台乱码:如果你在打印控制文本时看到乱码(
print(edit.window_text())),这通常是控制台本身的编码问题(Windows 控制台默认是 GBK/GB2312,而 PyWinAuto 返回的是 utf-8),可以在打印前进行转码:text = edit.window_text() # 尝试打印到控制台,如果乱码则直接操作(如输入到文件) print(text.encode('utf-8').decode('gbk', errors='ignore')) # 或者直接写入文件 with open('output.txt', 'w', encoding='utf-8') as f: f.write(text)
- 支持中文:非常稳定,只要你的 Windows 系统能显示中文,就可以用 PyWinAuto 操作。
- 最佳实践:始终使用 UIA 后端(
backend="uia"),并在匹配字符串时优先使用 正则表达式 以提高兼容性。 - 唯一限制:如果目标程序本身是乱码(如英文系统上运行的编码错误软件),PyWinAuto 自然也无法识别正确的中文,但这是程序本身的问题。
如果你遇到具体的“中文识别失败”情况(例如报错 ElementNotFoundError),可以分享具体的控件类型、应用程序名称和报错信息,我可以提供更精准的定位代码。