PC应用程序自动化(python)


个人向笔记。

看的是BV14Y4y1z7z6这个视频。

假期感兴趣看了一点点,感觉和我的日常工作匹配度不太高,所以先记录到这里,后面再补充。


 

PC自动化--pywinauto

0、前置

0.1 是个后端的访问。

application:作用范围是一个进程;
desktop:作用范围可以跨进程。

0.2 程序检测辅助工具

gui对象检查:
看哪个显示的控件更详细,则更适合哪个后端。
a、inspect.exe: ‪C:\Program Files (x86)\Windows Kits\10\bin\10.0.xxxxx.0\x64\inspect.exe 没有的话下载windows sdk和windows wdk,注意版本的匹配。
b、spy++.exe:安装vstudio会带着这个软件。在vs安装软件里单个组件搜“c++必备工具(?)” C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\spyxx_amd64.exe 
  遇到的问题:spy++查找窗口获取的句柄一直是00000????----只用spy++可以,spy++_amd有这个问题。
c、viewwizard:下载的都报毒,先不安装了

1、应用程序&窗口

1.1 打开应用程序

复制代码
 1 from pywinauto.application import Application
 2 import time
 3 
 4 # 1. 打开windows自带的应用:记事本
 5 app=Application(backend="uia").start("notepad.exe")
 6 # 2.打开任意应用程序
 7 # 目前的应用程序一般是用uia打开,打不开的话可以再换win32。
 8 # start(r""),r防转义。
 9 # backend="后端类型",start(r"程序路径"),backend用来指定后端类型
10 app=Application(backend="uia").start(r"D:\work\wechat\WeChat.exe")
复制代码

1.2 连接已经打开的应用程序

进程号和窗口句柄可以通过spy++查看,也可以用viewwizard看。

复制代码
 1 from pywinauto.application import Application
 2 import time
 3 
 4 # 通过pywinauto连接已经打开的应用程序
 5 # 1. 通过进程号连接
 6 app=Application("uia").connect(process=1856)
 7 print(app)
 8 # 2.通过窗口句柄连接
 9 handler_hex="00030C6C"
10 handler_10=int(handler_hex,16)
11 app=Application("uia").connect(handle=handler_10)
12 print(app)
复制代码

1.3 通过pywinauto选择指定的窗口

复制代码
from pywinauto.application import Application
import time
app=Application("uia").start("notepad.exe",timeout=10)

# 查看窗口,看看列表里是否有要打开的这个文件,循环列表,打印每个元素的class_name(),即每个元素的类名。
# 所以记事本的类就是Notepad,但是不知道为什么打不开。
a=app.windows()
for i in a:
    print(i.class_name())
'''
# 打印控件会报ElementNotFoundError:找到了不止一个元素,老师用的是navicat实验,我没装;
# 可以考虑加个except ElementNotFoundError:
# 尝试打开记事本(系统软件)测试,使用窗口标题赋值,然后放大窗口和打印控件都是好的,但是类不行,报:findbestmatch.MatchError未匹配;
# 我把类给改成Dialog,行了.----考虑spy++识别的类和python认为的类不一样.
'''
# 1. 方式一 app[类名/标题]:推荐
# 1.1 使用类名选择窗口
# 这里的dlg赋值,pywinauto不会监测是否真的有这个进程,它只会直接赋值。
dlg=app["Dialog"]

# 1.2 使用窗口标题选择窗口
dlg=app["无标题 - 记事本"]

# 2. 方法二:app.窗口类名
dlg=app.Dialog

# 打印窗口中的所有控件
dlg.print_control_identifiers()
复制代码

1.4 应用程序的窗口操作方法

复制代码
from pywinauto.application import Application

# 窗口最大化和窗口最小化不能同时执行。
app=Application("uia").start("notepad.exe",timeout=10)
dlg=app["无标题 - 记事本"]
# 窗口最大化
dlg.maximize()
# # 窗口最小化
# dlg.minimize()
# 窗口恢复正常大小
dlg.restore()
# 查看窗口显示状态,正常:0,最大化:1
status= dlg.get_show_state()
print(status)
# 获取当前窗口显示的坐标
rect=dlg.rectangle()
print(rect)# (L810, T382, R2158, B1774)程序左上右下边距离屏幕左边和上边的距离。
# 关闭窗口
dlg.close()
复制代码

 1.5 选择窗口上的控件

复制代码
from pywinauto.application import Application

# 启动程序
app=Application("uia").start("notepad.exe")
# 看一下程序的信息
print(app.windows())
# 通过类打开程序
dlg=app["Dialog"]
# 打印程序的所有控件
dlg.print_control_identifiers()
# 选择菜单栏
# 方法一
# 仅适用于英文程序
menu=dlg.menu2
print(menu.print_control_identifiers())
# 方法二
menu=dlg["menu2"]
print(menu.print_control_identifiers())
# 方法三---dlg["工具识别出来的窗口标题"],我用的spy++识别记事本的菜单栏识别不到窗口标题,所以作罢。
# 这个属于了解就好,所以在这里写一下。
# 想要操作"文件":
file = dlg["menu2"]["MenuItem"]# 会报错,假设这个获取不到的话,就用下面的方法。
file = menu.child_window(title="文件(F)", control_type="MenuItem")
print(file.print_control_identifiers())
复制代码

方法二与方法三附图:

下一步是要操作窗口控件,但是不同的窗口控件的操作方法是不同的,所以——

1.6 窗口控件的分类

dialog:对话框/窗口
statusbar:状态栏
static:静态内容
actiontoolbar:工具栏
pane:窗格
menu:菜单栏
menuitem:菜单项
titlebar:标题栏
treeview:树状视图
edit:编辑栏
balalaba:略


 

1.7 窗口控件基本属性的获取方法

n.n 可以考虑有心情的时候看下rpa

posted @   荔枝白  阅读(238)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示