作为服务运行时可用的 Pystray 图标



使用:

  • 蟒蛇 (3.7.5(
  • Pyinstaller (3.5(
  • 皮温32 (223(
  • 皮斯特雷(当前(

我有一个使用Pysray显示图标的python程序,该图标允许我使Tkinter窗口可用。 这花了一段时间,但由于堆栈溢出,此功能运行良好。 然后,我使用 PyInstaller 为此创建了一个可执行文件,这也运行良好。到目前为止,一切都很好,执行程序会启动其 Web 服务并显示图标。

我从使用 pywin32 创建的服务调用此程序。 该程序按预期启动,并且它的网络服务功能可用,但是我看不到系统托盘图标。 我认为这是因为我以管理员身份登录,但该服务在一般服务帐户下运行。

有没有办法让所有登录到机器的用户都可以使用 Pystray 图标?

这个链接解释了这一切: https://learn.microsoft.com/en-us/archive/blogs/winsdk/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later

摘要 : 您不能像往常一样从Windows服务打开交互式进程,因为该服务在完全不同的环境(又名会话0(上运行,而登录用户的会话ID为1...2...,具体取决于用户数量。

如果您启动服务并查看任务管理器中的"详细信息"选项卡,您会发现您的进程正在运行但没有显示

据我了解,在这里我们(一段时间后我也遇到了完全相同的问题(正在尝试从会话 0 中的服务打开一个进程,并且它无法直接与会话 1 交互? 所以我们应该使用 CreateProcessAs User 以用户身份创建新进程

我使用以下代码使其运行:

# A SETUP FOR STARTUPINFO
startupInfo = win32process.STARTUPINFO()
startupInfo.dwFlags = win32process.STARTF_USESHOWWINDOW
startupInfo.wShowWindow = win32con.SW_NORMAL
# GET THE TOKEN FOR LOGGED-IN USER
console_session_id = win32ts.WTSGetActiveConsoleSessionId()
console_user_token = win32ts.WTSQueryUserToken(console_session_id)
# GET THE LOGGED IN USER'S ENVIRONMENT TOO
environment = win32profile.CreateEnvironmentBlock(console_user_token, False)
win32process.CreateProcessAsUser(console_user_token,
'notepad.exe', # PATH TO YOUR EXECUTABLE / SCRIPT
None, # THIS ONE IS 'COMMAND LINE' IF YOU INTEND YOU USE IT
None,
None,
0,
win32con.NORMAL_PRIORITY_CLASS,
environment, # TO OPEN IN USER'S ENVIRONMENT
None,
startupInfo)

如果您有任何疑问,请告诉我

最新更新