【发布时间】:2012-10-10 08:31:23
【问题描述】:
我需要一个在用户桌面上启动 .exe 的服务。我还需要在用户登录桌面后立即启动此服务。 (Windows 7 平台)
我确实有 SENS 事件,但不确定如何将上述谜题放在一起。我也知道 Runkey 中的任何 .exe 都会在窗口启动时启动,但是如何将我的服务放入 Runkey 中?
任何帮助将不胜感激。
谢谢。
【问题讨论】:
我需要一个在用户桌面上启动 .exe 的服务。我还需要在用户登录桌面后立即启动此服务。 (Windows 7 平台)
我确实有 SENS 事件,但不确定如何将上述谜题放在一起。我也知道 Runkey 中的任何 .exe 都会在窗口启动时启动,但是如何将我的服务放入 Runkey 中?
任何帮助将不胜感激。
谢谢。
【问题讨论】:
除了 Windows 服务之外的另一个选项是编写一个托盘应用程序,当用户以交互方式登录时,它将在托盘中启动。这消除了对始终运行并且必须检测何时发生登录的 Windows 服务的需求。当他们登录时,它将在托盘中启动,以他们的身份运行,您可以在托盘应用程序中提供 gui 来启动/停止服务。
这是一个 S.O.帖子:
How can I make a .NET Windows Forms application that only runs in the System Tray?
如果您希望它在未交互登录的情况下也始终运行,那么 Windows 服务就是您的最佳选择。
【讨论】:
您将需要 Windows 服务,请查看 http://msdn.microsoft.com/en-us/library/zt39148a%28v=vs.80%29.aspx 。在服务中,您需要检测用户何时登录:how to detect windows started or user login in c#(.net) windows service?
【讨论】:
从 Vista 开始不应该这样做,因为服务被设计为不能与桌面交互。这是有关该主题的更深入的文档。
http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx
通常,您会将桌面可执行文件放在用户启动文件夹或类似文件夹中,并让它与服务通信。
这是影响你的段落:
对于更复杂的交互,开发人员应该将他们的 UI 代码移动到在用户会话中运行并处理所有 UI 要求的代理中。代理通过 RPC 或命名管道与服务通信。如果用户使用控制面板、Internet Explorer 或类似的 UI 体验启动 UI 交互,则该 UI 体验应启动代理。然后代理处理所有 UI 交互。如果需要 UI 但用户未启动,则服务必须请求代理启动任何所需的 UI,而不是尝试自行启动该 UI。在服务必须启动用户交互并且代理尚未运行的极少数情况下,服务应调用 CreateProcessAsUser API 来启动代理。然后代理可以启动所有 UI 交互。对于开发人员来说,仔细审查所有可能的使用场景并考虑将所有 UI 代码移动到在用户会话中运行的代理中是很重要的。
【讨论】: