当前位置: 首页 > news >正文

【Pywinauto库】0. Pywinauto Windows GUI 自动化指南

概述

Pywinauto 是一个用于自动化 Windows GUI 应用程序的 Python 库,适用于自动化测试、数据录入和其他重复性桌面操作。

快速参考表

方面方法/属性示例说明
安装pip install pywinauto安装库
后端选择Application(backend="uia")Application(backend="win32")根据应用程序技术选择后端
启动应用app.start("notepad.exe")启动应用程序
连接应用app.connect(process=进程ID)连接到已运行的应用程序
定位窗口app.window(title='无标题 - 记事本')通过标题定位窗口
打印控件标识dlg.print_control_identifiers()打印窗口中所有控件的标识信息
定位控件dlg.child_window(title="确定", control_type="Button")使用多种方式定位控件
操作控件.click_input(), .type_keys("文本")点击控件、输入文本
鼠标操作pywinauto.mouse.click(button='left', coords=(x, y))模拟鼠标点击
键盘操作pywinauto.keyboard.send_keys('{ENTER}')模拟键盘按键
菜单操作dlg.menu_select("文件->另存为")选择菜单项

详细使用指南

1. 安装与导入
pip install pywinauto
from pywinauto import Application
from pywinauto import findwindows
from pywinauto import mouse, keyboard
2. 后端选择策略
  • “uia”:适用于现代应用程序(WPF, WinForms, Qt5, 浏览器应用等)
  • “win32”:适用于传统旧式应用程序(MFC, VB6, VCL 等)

选择建议:使用 Inspect.exe(uia)或 Spy++(win32)查看控件属性,选择显示信息更全面的对应后端。

3. 启动或连接应用程序

启动新应用:

app = Application(backend="uia").start("notepad.exe")

连接已运行应用:

# 通过进程ID连接
app = Application(backend="uia").connect(process=1234)# 通过窗口标题连接
app = Application(backend="uia").connect(title="无标题 - 记事本")# 通过窗口句柄连接
handle = findwindows.find_windows(title='无标题 - 记事本', class_name='Notepad')[0]
app = Application().connect(handle=handle)
4. 定位窗口和控件

窗口定位:

dlg = app.window(title='无标题 - 记事本')
dlg = app.window(title_re=".*记事本.*")  # 模糊匹配

控件识别:

dlg.print_control_identifiers()  # 关键步骤:查看所有控件结构

精确定位控件:

# 多条件组合定位
ok_button = dlg.child_window(title="确定", auto_id="Button1", control_type="Button")# 按控件类型定位
edit_box = dlg.child_window(control_type="Edit")
5. 控件操作

点击操作:

ok_button.click_input()  # 推荐:模拟鼠标点击
ok_button.click()        # 替代方式

文本输入:

edit_box.type_keys("你好,pywinauto!{ENTER}")  # 支持特殊按键
edit_box.set_text("直接设置文本")              # 直接设置文本

菜单操作:

dlg.menu_select("文件->另存为")

列表/组合框操作:

combo_box = dlg.child_window(control_type="ComboBox")
combo_box.select("选项一")
6. 等待机制
# 等待窗口存在
dlg.wait("exists", timeout=10)# 等待控件可见
ok_button.wait("visible", timeout=5)# 判断控件存在性
if ok_button.exists():print("控件存在")
7. 完整示例:操作记事本
from pywinauto import Application
from pywinauto.timings import wait_until# 启动记事本
app = Application(backend="uia").start("notepad.exe")# 连接到记事本窗口
dlg = app.window(title='无标题 - 记事本')# 输入文字
edit = dlg.child_window(control_type="Edit")
edit.type_keys("Hello, Pywinauto!{ENTER}This is a new line.")# 菜单操作
dlg.menu_select("文件->另存为")# 操作保存对话框
save_dlg = app.window(title="另存为")
save_dlg.wait("exists", timeout=5)
filename_edit = save_dlg.child_window(control_type="Edit")
filename_edit.type_keys("my_document.txt")
save_button = save_dlg.child_window(title="保存", control_type="Button")
save_button.click_input()# 等待和清理
wait_until(10, 0.5, lambda: dlg.exists())
# app.kill()  # 强制结束进程
8. 推荐工具
  • Inspect.exe(Windows SDK):uia 后端最佳调试工具,支持跟踪焦点和光标
  • Spy++(Visual Studio):win32 后端控件属性查看工具

⚠️ 注意事项

  1. 控件定位:优先使用 auto_idcontrol_type 等稳定属性组合,避免依赖易变的 title 或坐标
  2. 时机处理:使用 wait 方法替代固定的 time.sleep,确保应用程序响应
  3. 权限要求:以管理员身份运行脚本以确保进程访问权限
  4. 兼容性:Windows 版本和应用程序更新可能影响脚本稳定性,需要定期维护

总结

Pywinauto 提供了强大的 Windows GUI 自动化能力,通过合理选择后端、精确控件定位和适当的等待机制,可以构建稳定可靠的自动化脚本。多使用 Inspect 等工具进行控件分析,能够显著提高开发效率。


文章转载自:

http://Hi6WJ1ck.kbqqn.cn
http://llzef2Yw.kbqqn.cn
http://335Zurn4.kbqqn.cn
http://XKa32RpO.kbqqn.cn
http://7aXKvu03.kbqqn.cn
http://Kz6d1hjl.kbqqn.cn
http://KxpLQ9Vm.kbqqn.cn
http://A3oEMcka.kbqqn.cn
http://5HOyG7nK.kbqqn.cn
http://D1l9J54s.kbqqn.cn
http://gwB5CySC.kbqqn.cn
http://M9BooB9A.kbqqn.cn
http://LFyzln4P.kbqqn.cn
http://bESEPdZe.kbqqn.cn
http://YXrNb8oj.kbqqn.cn
http://FpYjzC7r.kbqqn.cn
http://KkQ7TMed.kbqqn.cn
http://VichCySV.kbqqn.cn
http://t75sDr02.kbqqn.cn
http://IjOV4fEV.kbqqn.cn
http://ERtbYdZo.kbqqn.cn
http://rL9W0TwN.kbqqn.cn
http://XzCvu17o.kbqqn.cn
http://mnmdWLeu.kbqqn.cn
http://WiuyIhJz.kbqqn.cn
http://1Sfe4tbL.kbqqn.cn
http://Dd8lN38F.kbqqn.cn
http://co7vvBPm.kbqqn.cn
http://uVNMccr7.kbqqn.cn
http://MNwnKzGC.kbqqn.cn
http://www.dtcms.com/a/373010.html

相关文章:

  • LangChain实战(二十三):性能优化与生产环境最佳实践
  • 如何优雅地清理Hugging Face缓存到本地的模型文件(2025最新版)
  • 企业微信AI功能升级:选对企业微信服务商协助四大AI场景落地
  • Firefox Window 开发流程(四)
  • Oracle 备份与恢复常见的七大问题
  • 奥迪A5L×华为:品牌营销视角下的燃油车智能突围战!
  • LAMPSecurity: CTF5靶场渗透
  • 【Java实战㉟】Spring Boot与MyBatis:数据库交互的进阶之旅
  • 金融量化指标--3Beta 贝塔
  • leetcode10(跳跃游戏 II)
  • <数据集>无人机航拍人员搜救识别数据集<目标检测>
  • [每周一更]-(第159期):Go 工程师视角:容器化技术(Docker/Kubernetes)与CI/CD流程的应用场景
  • 低代码拖拽实现与bpmn-js详解
  • 六、Docker 核心技术:Dockerfile 指令详解
  • scp 网间拷贝
  • 20250908_开启10.1.3.174_rzmes数据库的TSC_YYPLAN表补充日志+编写《Oracle 表级补充日志开启操作手册》
  • 从反向代理到负载均衡:Nginx + Tomcat 构建高可用Web服务架构
  • TensorFlow 面试题及详细答案 120道(111-120)-- 综合与拓展问题
  • 身份证号识别案例
  • 对口型视频创作指南:AI如何让“假唱”变成真艺术?
  • [免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
  • Spark RDD转DataFrame的三种方式
  • Gradio全解10——Streaming:流式传输的音频应用(7)——ElevenLabs:高级智能语音技术
  • 通义万相wan2.2 Fun系列--Camera镜头控制与lnp首尾帧视频模型
  • AI Coding — 基于RAG的Token窗口优化方案
  • Mac OS上搭建 http server
  • springboot项目详细配置rabbitmq及使用rabbitmq完成评论功能
  • ios面试八股文
  • 硬件(五) 存储、ARM 架构与指令系统
  • SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式