【问题标题】: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 应用程序发送消息?

【问题讨论】:

    标签: c++ windows windows-services messages createprocess


    【解决方案1】:

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

    【讨论】:

    • 就是这样!控制服务正是我想要的。我已经使用具有 SC_MANAGER_CONNECT 访问权限的 OpenSCManager 打开了服务,然后使用 SERVICE_USER_DEFINED_CONTROL 打开了 OpenService,对 ControlService 的简单调用解决了这个问题。即使用户没有特权,它也可以工作,这很完美。非常感谢@CoreTech。
    【解决方案2】:

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

    【讨论】:

    • 非常感谢您的回答!!我现在就去处理。
    【解决方案3】:

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

    您可以找到更多信息herehere

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

    【讨论】:

    • 非常感谢 Zdeslav。我要读你的链接。当我得到解决方案时,我会再次发布。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2013-04-13
    • 2015-11-25
    相关资源
    最近更新 更多