1

使用:

  • 蟒蛇(3.7.5)
  • Pyinstaller (3.5)
  • Pywin32 (223)
  • Pystray(当前)

我有一个 python 程序,它使用 Pystray 显示一个图标,使我可以使用 Tkinter 窗口。花了一些时间,但是由于堆栈溢出,这个功能可以正常工作。然后我使用 PyInstaller 为此创建一个可执行文件,它也运行良好。到这里一切都很好,执行程序会启动它的 web 服务并显示图标。

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

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

4

1 回答 1

0

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

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

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

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

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

# 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)

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

于 2020-04-13T18:34:41.630 回答