个人向笔记。
看的是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
标签:控件,dlg,Application,python,app,应用程序,PC,print,窗口 From: https://www.cnblogs.com/hanna-ov0/p/18018173