0

我创建了一个 Windows 服务来使用 createProcessAsUser 运行我的自定义应用程序。结果是一个应用程序在会话 ID 0 中使用 SYSTEM 用户运行,正如我所料。我的问题是,我需要在此应用程序与当前用户创建的其他应用程序之间进行一些通信。

如果某些桌面事件发生(SC_SCREENSAVE,监视器关闭),当前用户应用程序捕获的事件,我需要告诉我的系统应用程序。我用过:

SendMessage(HWND_BROADCAST, CURRENT_USER_HAS_DONE_SOMETHING, 0, 0);

即使 SYSTEM 应用程序捕获了很多系统事件(挂起、注销...),并且在同一个会话 ID 中运行,我的自定义消息也永远不会被捕获。Sendmessage 似乎不适用于 SYSTEM 用户。

如何从用户当前会话向 SYSTEM 应用程序发送消息?

4

3 回答 3

2

另一种选择是使用旧的ControlService 功能以及用户定义的控制代码。它不适合复杂的通信(您不能将任何参数传递给服务),但它适用于您概述的简单“发生了什么事”的通知。

于 2013-03-12T14:38:31.617 回答
1

最新版本的 Windows 不允许在会话 0 和桌面会话之间交换消息。这称为Session 0 隔离

您可以在此处此处找到更多信息。

通常的替代方案是 TCP/IP、管道、远程处理等,这些都在这个 SO answer中进行了描述。

于 2013-03-12T10:21:25.773 回答
1

显然广播消息不是正确的解决方案。一个更好的解决方案可能是CreateEventEx. 这将创建一个命名事件。然后,您的常规应用程序可以调用SetEvent,并且该SYSTEM应用程序可以等待此事件。

于 2013-03-12T10:22:58.847 回答