Python - 如何与系统托盘弹出窗口交互

Python - How to interact with system tray popup

我想通过应用程序的系统托盘图标自动登录。 我使用 pywinauto 模块与托盘图标交互以启动应用程序,现在我有一个弹出窗口要求我登录。 但是...我不知道如何与之互动!

这是我的图标: Tray Icon

这里是我的代码的摘录(工作正常):

_pApp = Application().connect(path='my_app_dir')
taskbar.ClickSystemTrayIcon(1)
_pApp.PopupMenu.menu_item('submenu').click_input()
_pApp.PopupMenu.menu_item('another_submenu').click_input()

如何与下方的弹窗认证window交互?

Popup window

感谢您的帮助。

我终于找到了 pywinauto.keyboard 的解决方案。我不知道它是否干净,但它确实有效。

from pywinauto.keyboard import *
[...]
send_keys(_user)
send_keys("{VK_TAB}")
send_keys(_pass)
send_keys("{ENTER}")

目前,我重写了一部分代码:

from pywinauto import taskbar
from pywinauto.application import Application
from pywinauto.keyboard import *
from tkinter.messagebox import *

[...]

app_dir = r'C:\Program Files\Common Files\App\App.exe'
_user = "TOTO"
_pass = "TOTOPASS"

# Check if my app has its system tray icon in the taskbar
for i in range(0, 10):
     tsIcon = taskbar.SystemTrayIcons.wrapper_object()
     tsValue = tsIcon.button(i).info.text
     # If I find it, the code click on it and its menu until the popup auth window come
     if "App_name" in tsValue:
        _pApp = Application().connect(path=app_dir)
        taskbar.ClickSystemTrayIcon(i)
        _pApp.PopupMenu.menu_item('menu').click_input()
        _pApp.PopupMenu.menu_item('menu->submenu').click_input()
        time.sleep(2)
        # When the popup window comes out, I run 'send_keys'
        send_keys(_user)
        send_keys("{VK_TAB}")
        send_keys(_pass)
        send_keys("{ENTER}")
     else:
        showwarning("Error", "App not found !")
[...]

我的代码看起来不错?还有另一种 "most clean" 方法 ?

谢谢

最后,我发现了预期的行为:)

谢谢 Vasily Ryabov!你的方法很有用!

我不再使用'send_keys'了。

from tkinter.messagebox import *
from pywinauto import taskbar
from pywinauto.application import Application
[...]

_user = "TOTO"
_pass = "TOTOPASS"
app_dir = r'C:\Program Files\Common Files\App\App.exe'
icon_list = list()

# Getting the name of the icons in the sys tray
for i in range(0, 13):
    app_sti = taskbar.SystemTrayIcons.wrapper_object()
    app_stv = pulse_sti.button(i).info.text
    icon_list.append(app_stv)

# Looking for my app name
try:
    if "App_name" in str(icon_list):
       app = Application().connect(path=app_dir)
       taskbar.ClickSystemTrayIcon("App name")
       app.PopupMenu.menu_item('menu').click_input()
       app.PopupMenu.menu_item('menu -> submenu').click_input()
       app_auth = Application(backend="uia").connect(title_re="Title*", timeout=5)
       app_auth_window = app_auth.window(title_re="Title*")
       app_auth_window.child_window(title="User :", control_type="Edit").set_text(_user)
       app_auth_window.child_window(title="Password :", control_type="Edit").set_text(_pass)
       app_auth_window.child_window(title="Connect", control_type="Button").click()
except Exception as error:
    showwarning("Error", "App not found !")