python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python3 pywinauto获取程序元素

Python3使用pywinauto如何检测需要获取程序元素

作者:诸神缄默不语

这篇文章主要为大家详细介绍了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应该也没问题)

如果进程不在任务管理栏显示,通过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获取程序元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文