以微信为例。其实我是想找个可以用pywinauto操作全流程的例子但是没找到,所以就先操作定位窗口和查看控件两部分了。
因为我一开始是想用pywinauto操作关注微信公众号界面的,发现显示不出来……也就是说面对这种情况比较合适的解决方案是找别的工具,呃编程就是这样的,你要欣然接受新工具才对。
我下次遇到用pywinauto对程序内部进行操作的更具体的工具我再来写那一部分。
1. 安装包
pip install pywinauto
2. 检测需要如何获取程序元素的过程
1. 定位微信窗口
首先需要看微信这个进程打开了多少个窗口(这个title就是任务管理栏显示的进程标题,可以用正则表达式。如果是不会在任务管理栏显示,使用1.5节的代码):
代码:
from pywinauto import findwindows # 查找所有匹配的窗口 windows = findwindows.find_elements(title='微信', backend='win32', visible_only=false) # 打印所有匹配的窗口信息 for i, window in enumerate(windows): print(f"window {i+1}:") print(f" title: {window.name}") print(f" class name: {window.class_name}") print(f" handle: {window.handle}") print(f" process id: {window.process_id}") print(f" rectangle: {window.rectangle}") print("-" * 50)
输出是:
window 1:
title: 微信
class name: traynotifywnd
handle: omit
process id: omit
rectangle: (l1334, t848, r1667, b1021)
--------------------------------------------------
window 2:
title: 微信
class name: wechatmainwndforpc
handle: omit
process id: omit
rectangle: (l0, t-2, r1920, b1020)
--------------------------------------------------
window 3:
title: 微信
class name: chrome_widgetwin_0
handle: omit
process id: omit
rectangle: (l0, t0, r1920, b1020)
--------------------------------------------------
traynotifywnd是一个通常用于托盘通知的窗口,chrome_widgetwin_0看起来像是一个基于 chromium 引擎的窗口(可能是通过 webview 或者嵌入式浏览器来实现的)。所以应该选择 window 2,即 class name: wechatmainwndforpc,这是微信的主界面窗口。
(↑这是我问chatgpt得知的,所以如果你不确定的话,直接也问chatgpt就vans。直接设置visible_only参数为true应该也没问题)
如果进程不在任务管理栏显示,通过psutil获取所有进程的标题来找到所需进程
这个当然首先假设你这个进程是有标题的,而且你能猜到这标题是什么意思……
代码是:
import psutil for proc in psutil.process_iter(): try: print(proc.name()) except (psutil.nosuchprocess, psutil.accessdenied, psutil.zombieprocess): pass
2. 连接微信窗口并查看其中的可操作项
代码中的omit就是window 2的handle值:
from pywinauto import application app=application(backend="uia").connect(handle=omit) dlg=app.window(title="微信") dlg.print_control_identifiers()
backend还可以换成win32
connect()函数还可以通过标题作为参数,如果用正则表达式的话参数就是title_re
dlg也可以用top_window()函数来获取。还有一个函数是windows(),这里面第一个也是这个指定窗口。
print_control_identifiers()参数默认应该是打印所有内容,可以设置depth参数来设置打印多少层。
需要注意的是如果直接运行这个代码会导致运行慢而且打印过多,反正我是没打印完,因为它会把所有聊天记录什么的全都打印出来。
但是我在关注公众号界面(也就是我本来想实现自动化操作的界面)打印控件又打印不出东西,打印出来是这样的:
control identifiers:
dialog - '微信' (l0, t-2, r1920, b1020)
['dialog', '微信', '微信dialog']
child_window(title="微信", control_type="window")
到此这篇关于python3使用pywinauto如何检测需要获取程序元素的文章就介绍到这了,更多相关python3 pywinauto获取程序元素内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论