我有一项服务,不断检查某些应用程序并确保它没有关闭。如果此应用关闭 - 服务再次启动它。
当用户决定注销会话时,问题就开始了。在注销期间,所有应用程序都将关闭,包括我的应用程但该服务仍在运行,并不断尝试再次启动它。
问题是如何通知服务用户将要注销并且不再需要重新启动应用程序?我试图使用SERVICE_CONTROL_SESSIONCHANGE通知来制作它。但是根据MSDN,当所有应用程序已经关闭并且注销程序完成时,它们会进入服务。对我来说太迟了。有没有办法以编程方式找出当前会话正在注销?
我的服务是在LocalSystem帐户下启动的。
感谢。
P.S。我无权访问应用程序源代码。需要在不修改目标的情况下实现目标。
答案 0 :(得分:2)
让您的服务运行两个应用程序:一个是监视程序,另一个是您自己实现的。然后,第二个可以通过向服务发送消息来响应注销事件(David Heffernan的回答),然后服务将知道不重新启动被监视的作业。
答案 1 :(得分:0)
在您的应用和服务之间打开一个沟通渠道,并安排应用程序告知服务由于注销事件而关闭它。
答案 2 :(得分:0)
您可能无权访问可执行文件的源代码,但这并不意味着您不能影响进程。例如,你可以inject a DLL。使用SetWindowsHookEx
,您会抓住发送到应用主窗口的WM_ENDSESSION
。
答案 3 :(得分:0)
为什么不在运行应用程序的用户下创建服务并告诉它自动启动?在这种情况下,您应该在用户注销时收到SERVICE_CONTROL_SHUTDOWN消息,因为该服务也将被终止。