pywinauto如何右键点击系统托盘图标选择菜单及子菜单项
问题原因
sysapp.menu_select('About')执行失败核心原因是:托盘图标右键弹出的上下文菜单由系统explorer.exe进程托管,并不属于TrayStatus.exe自身的顶级窗口菜单,直接对目标应用进程调用菜单选择方法自然找不到对应菜单项。另外原代码还存在一处笔误:target_app.target_app.print_control_identifiers()多写了一层target_app属性,运行时会直接触发属性错误。
修复后完整实现代码
from pywinauto import Application import time # 打开托盘隐藏图标展开面板 app = Application(backend="uia").connect(path="explorer.exe") systemTray = app.window(class_name="Shell_TrayWnd") systemTray.child_window(title="Notification Chevron").click_input(button="left") time.sleep(0.25) # 连接托盘溢出窗口 list_box = Application(backend="uia").connect(class_name="NotifyIconOverflowWindow") list_box_win = list_box.window(class_name="NotifyIconOverflowWindow") list_box_win.wait('visible', timeout=30, retry_interval=3) # 定位目标托盘图标 target_app = list_box_win.child_window(title="TrayStatus Pro Trial 4.6\r\nCaps Lock: Off") target_app.wait('visible', timeout=30, retry_interval=3) # 右键点击图标 target_app.click_input(button="right") time.sleep(0.3) # 等待右键菜单渲染完成 # 直接定位系统托管的右键菜单中的About项并点击 about_menu = app.window(class_name="#32768") # 系统标准上下文菜单的固定类名 about_menu.wait('visible', timeout=5) about_menu.child_window(title="About", control_type="MenuItem").click_input()
关键说明
- Win10及以上版本的托盘控件、系统上下文菜单优先使用
uia后端操作,win32后端对这类控件识别兼容性极差 - 系统所有标准右键弹出菜单的窗口类名固定为
#32768,不需要额外遍历控件树即可快速定位 - 点击托盘图标、展开菜单的步骤后必须加短等待,给系统UI留出渲染时间,否则会随机出现找不到控件的问题
- 如果当前安装的TrayStatus版本About菜单标题带后缀(比如
About TrayStatus),把定位时的title参数改成对应完整文本即可,可以在右键后临时加about_menu.print_control_identifiers()打印所有菜单项确认准确标题。
内容的提问来源于stack exchange,提问作者JDB
相关产品推荐
相关产品推荐

