首页 文章

如何捕获从Windows服务启动的会话注销

提问于
浏览
2

我有一个服务,不断检查一些应用程序,并确保它没有关闭 . 如果此应用关闭 - 服务再次启动它 .

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

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

我的服务是在LocalSystem帐户下启动的 .

谢谢 .

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

4 回答

  • 0

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

  • 2

    打开应用程序和服务之间的通信通道,并安排应用程序告知服务由于注销事件而关闭 .

  • 0

    您可能无法访问可执行文件的源代码,但这不会影响该进程 . 例如,你可以inject a DLL . 使用 SetWindowsHookEx ,您将捕获发送到应用程序主窗口的 WM_ENDSESSION .

  • 0

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

相关问题