用Python3中的pywinauto包定位程序窗口和查看可操作控件

该文章已生成可运行项目,

诸神缄默不语-个人优快云博文目录

以微信为例。其实我是想找个可以用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应该也没问题)

1.5 如果进程不在任务管理栏显示,通过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")

这不是完全就什么都没识别出来吗?尼玛啊……
所以本期教程就到这里就结束了,其他实现和操作请待后续分解。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值