我创建了一个Windows服务来使用createProcessAsUser运行我的自定义应用程序。结果是一个应用程序在会话Id 0中运行SYSTEM用户,正如我所期望的那样。我的问题是,我需要在此应用程序与当前用户创建的其他应用程序之间进行一些通信。
如果某些桌面事件发生(SC_SCREENSAVE,监视关闭),当前用户应用程序捕获的事件,我需要告诉我的SYSTEM应用程序。我用过:
SendMessage(HWND_BROADCAST,CURRENT_USER_HAS_DONE_SOMETHING,0,0);
即使SYSTEM应用程序捕获了很多系统事件(挂起,注销......),并且在同一个会话ID中运行,我的自定义消息也从未被捕获。似乎Sendmessage对SYSTEM用户不起作用。
如何从用户当前会话向SYSTEM应用程序发送消息?
答案 0 :(得分:2)
另一种选择是使用旧的ControlService function以及用户定义的控制代码。它不适合复杂的通信(您不能将任何参数传递给服务),但它适用于您概述的简单“发生的事情”通知。
答案 1 :(得分:1)
最新版本的Windows不允许在会话0和桌面会话之间交换消息。这称为Session 0 isolation。
通常的替代方案是TCP / IP,管道,远程处理等,这些都在this SO answer中描述。
答案 2 :(得分:1)
显然,广播消息不是正确的解决方案。一个更好的解决方案可能是CreateEventEx
。这会创建一个命名事件。然后,您的常规应用可以拨打SetEvent
,SYSTEM
应用可以等待此活动。