如何从用户应用程序发送自定义消息到系统应用程序

How to send a custom message from user application to SYSTEM app?

本文关键字:应用程序 自定义消息 系统 用户      更新时间:2023-10-16

我已经创建了一个windows服务来运行我的自定义应用程序createProcessAsUser。结果是一个应用程序在会话Id为0的SYSTEM用户中运行,正如我所期望的那样。我的问题是,我需要在这个应用程序和当前用户创建的其他应用程序之间进行一些通信。

如果一些桌面事件发生(SC_SCREENSAVE, monitor off),当前用户应用程序捕获的事件,我需要告诉我的系统应用程序。我用过:

SendMessage(HWND_BROADCAST, CURRENT_USER_HAS_DONE_SOMETHING, 0,0);

即使SYSTEM应用程序捕获了许多系统事件(suspend, logoff…),并且在相同的会话Id中运行,我的自定义消息也不会被捕获。Sendmessage似乎对SYSTEM用户不起作用。

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

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

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

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

你可以在这里和这里找到更多信息。

通常的替代方案是TCP/IP,管道,远程等,在这个SO回答中有描述。