2

我有一项服务会不断检查某些应用程序并确保它没有关闭。如果此应用程序关闭 - 服务将再次启动它。

当用户决定注销会话时,问题就开始了。在注销期间,所有应用程序都将关闭,包括我的应用程序。但该服务仍在运行并不断尝试再次启动它。

问题是如何通知服务用户将要注销并且不再需要重新启动应用程序?我尝试使用 SERVICE_CONTROL_SESSIONCHANGE 通知来实现它。但是根据 MSDN,当所有应用程序都已经关闭并且注销程序完成时,它们才会提供服务。对我来说太晚了。有没有办法以编程方式找出当前会话正在注销?

我的服务在 LocalSystem 帐户下启动。

谢谢。

ps 我无权访问应用程序源代码。目标需要在不修改的情况下实现。

4

4 回答 4

2

让您的服务运行两个应用程序:一个是它的看门狗,另一个是您自己实现的。然后,第二个可以通过向服务发送消息来响应注销事件(大卫赫弗南的回答),然后服务将知道不重新启动监视的作业。

于 2011-05-08T18:44:53.097 回答
0

在你的应用和你的服务之间打开一个通信通道,并安排应用告诉服务它由于注销事件而关闭。

于 2011-05-08T18:32:22.013 回答
0

您可能无法访问可执行文件的源代码,但这并不意味着您不能影响该过程。例如,您可以注入一个 DLL。使用SetWindowsHookEx,您将捕获WM_ENDSESSION发送到应用程序主窗口的内容。

于 2011-05-09T09:16:00.897 回答
0

为什么不在运行应用程序的用户下创建服务并告诉它自动启动?在这种情况下,您应该在用户注销时收到 SERVICE_CONTROL_SHUTDOWN 消息,因为该服务也将被终止。

于 2011-05-09T09:21:45.347 回答