如何将用户应用程序的自定义消息发送到SYSTEM应用程序?

如何将用户应用程序的自定义消息发送到SYSTEM应用程序?

问题描述:

我已经创建了一个Windows服务来使用createProcessAsUser运行我的自定义应用程序。结果是一个应用程序以SYSTEM用户身份在会话ID 0中运行,正如我所期望的那样。我的问题是,我需要在该应用程序与当前用户创建的其他应用程序之间进行一些通信。如何将用户应用程序的自定义消息发送到SYSTEM应用程序?

如果一些桌面事件发生(SC_SCREENSAVE,关闭),当前用户应用程序捕获的事件,我需要告诉我的SYSTEM应用程序。我已经使用:

SendMessage(HWND_BROADCAST,CURRENT_USER_HAS_DONE_SOMETHING,0,0);

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

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

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

+0

就是这样!控制服务正是我想要的。我已经使用OpenSCManager打开了服务,使用SC_MANAGER_CONNECT访问权限,然后使用SERVICE_USER_DEFINED_CONTROL访问OpenService,并简单地调用ControlService来解决问题。即使用户没有特权,它也可以工作,这非常完美。非常感谢@CoreTech。 – tarsus04 2013-03-13 08:24:02

+0

+1不知道 – 2013-03-13 08:31:08

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

你可以找到更多信息herehere

常见的替代方法是在this SO answer中描述的TCP/IP,管道,远程处理等。

+0

非常感谢Zdeslav。我要阅读你的链接。当我得到解决方案时,我会再次发布。非常感谢。 – tarsus04 2013-03-12 10:43:29

很明显,广播消息不是正确的解决方案。更好的解决方案可能是CreateEventEx。这会创建一个命名事件。您的常规应用程序然后可以拨打SetEventSYSTEM应用程序可以等待此事件。

+0

非常感谢您的回答!我现在要处理它。 – tarsus04 2013-03-12 10:41:54