从服务广播消息/事件(到所有Windows会话)

时间:2011-06-27 15:59:59

标签: windows events windows-services

Windows设备管理功能“提供了一种方法,可以统一通知所有应用程序和系统组件可能影响其操作或资源访问的更改。”

我有一项服务需要向任何感兴趣的应用程序和服务提供某些事件的通知。这个API看起来非常合适,因为感兴趣的应用程序/服务可以选择使用RegisterDeviceNotification()接收广播,而发送者不必保留客户列表。

DBT_CUSTOMEVENT事件类型似乎是正确使用的类型,但只能由内核模式驱动程序发送。幸运的是有一个DBT_USERDEFINED。文档说明应该使用BroadcastSystemMessage()发送。

然后一位同事提醒我Windows Vista中的“会话零隔离”。 BroadcastSystemMessage()的{​​{1}}是否能够访问在所有会话中运行的应用程序以及其他服务?

看起来内核驱动程序不会出现问题,因为它们使用different function to send the message。但我的通知来自服务,而不是内核驱动程序。

我是在叫错树吗?我知道我可以使用命名管道,但我真的想要一种广播机制来保持尽可能简单。我不希望发起消息的服务必须担心它们的去向。我也想避免使用第三方库。我想以适当的微软批准的方式做到这一点,而不是重新发明轮子。

1 个答案:

答案 0 :(得分:1)

根据BroadcastSystemMessage()的文档,您可以添加BSM_ALLDESKTOPS标记,看起来根据您的需要而定。它需要SE_TCB_NAME权限。