首页 > 解决方案 > 如何从隐藏的系统托盘图标访问弹出菜单

问题描述

我使用以下代码访问隐藏图标并显示其弹出菜单并单击“注销”菜单项:

import time
from pywinauto.application import Application

app = Application(backend="uia").connect(path="explorer.exe")
st = app.window(class_name="Shell_TrayWnd")
t = st.child_window(title="Notification Chevron").wrapper_object()
t.click()
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)
list_box_win.child_window(title="Citrix Workspace").click_input(button='right').menu_item('Sign Out').click_input()

显示弹出菜单,但出现错误:AttributeError: 'NoneType' object has no attribute 'menu_item'

当我尝试添加此代码(而不是.menu_item('Sign Out').click_input())时:

connector = Application()
connector.connect(path="C:\\Program Files (x86)\\Citrix\\ICA Client\\SelfServicePlugin\\SelfService.exe")
connector.PopupMenu.MenuItem("Sign Out").ClickInput()

路径反映了负责系统托盘中图标的应用程序。我得到错误:MatchError: Could not find 'PopupMenu' in 'dict_keys([])'。所以我可以在弹出窗口中访问 menuitem 吗?

顺便说一句:它在带有 python 3.6 的 windows 10 64 位上运行。

标签: python-3.xsystem-traypywinautopopupmenu

解决方案


未抛光/优化(但有效)的代码如下所示:

import pywinauto.application
import time

taskbar = pywinauto.application.Application(backend="uia").connect(path="explorer.exe")

windows_tray = taskbar.window(class_name="Shell_TrayWnd")
tray = windows_tray.child_window(title="Notification Chevron").wrapper_object()
tray.click()

time.sleep(1)

app_list_box =  pywinauto.application.Application(backend="uia").connect(class_name="NotifyIconOverflowWindow")
app_list_box_win = app_list_box.window(class_name="NotifyIconOverflowWindow")

target_app = app_list_box_win.child_window(title = "Citrix Workspace")
target_app.click_input(button = "right")

citrix = pywinauto.application.Application().connect(path='Receiver.exe')
sign = citrix.PopupMenu.menu().get_menu_path("Sign In...")[0]
sign.click_input()

其中“Receiver.exe”是在系统托盘中运行的应用程序的可执行文件,其名称为“Citrix Workspace”。


推荐阅读