如何从用户应用程序向系统应用程序发送自定义消息?
Posted
技术标签:
【中文标题】如何从用户应用程序向系统应用程序发送自定义消息?【英文标题】:How to send a custom message from user application to SYSTEM app? 【发布时间】:2013-03-12 10:16:24 【问题描述】:我创建了一个 Windows 服务来使用 createProcessAsUser 运行我的自定义应用程序。结果是一个应用程序在会话 ID 0 中以 SYSTEM 用户运行,正如我所料。我的问题是,我需要在此应用程序与当前用户创建的其他应用程序之间进行一些通信。
如果某些桌面事件发生(SC_SCREENSAVE,监视器关闭),当前用户应用程序捕获的事件,我需要告诉我的系统应用程序。我用过:
SendMessage(HWND_BROADCAST, CURRENT_USER_HAS_DONE_SOMETHING, 0, 0);
即使 SYSTEM 应用程序捕获了很多系统事件(挂起、注销...),并且在同一个会话 ID 中运行,我的自定义消息也永远不会被捕获。 Sendmessage 似乎不适用于 SYSTEM 用户。
如何从用户当前会话向 SYSTEM 应用程序发送消息?
【问题讨论】:
【参考方案1】:另一种选择是使用旧的ControlService function 以及用户定义的控制代码。它不适用于复杂的通信(您不能将任何参数传递给服务),但它适用于您概述的简单的“发生某事”通知。
【讨论】:
就是这样!控制服务正是我想要的。我已经使用具有 SC_MANAGER_CONNECT 访问权限的 OpenSCManager 打开了服务,然后使用 SERVICE_USER_DEFINED_CONTROL 打开了 OpenService,对 ControlService 的简单调用解决了这个问题。即使用户没有特权,它也可以工作,这很完美。非常感谢@CoreTech。【参考方案2】:显然广播消息不是正确的解决方案。一个更好的解决方案可能是CreateEventEx
。这将创建一个命名事件。然后,您的常规应用程序可以调用 SetEvent
,SYSTEM
应用程序可以等待此事件。
【讨论】:
非常感谢您的回答!!我现在就去处理。【参考方案3】:最新版本的 Windows 不允许在会话 0 和桌面会话之间交换消息。这称为Session 0 isolation。
您可以找到更多信息here 和here。
通常的替代方案是 TCP/IP、管道、远程处理等,在this SO answer 中进行了描述。
【讨论】:
非常感谢 Zdeslav。我要读你的链接。当我得到解决方案时,我会再次发布。非常感谢。以上是关于如何从用户应用程序向系统应用程序发送自定义消息?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过azure设备配置服务从azure功能向iot设备发送自定义错误消息?