Трансляция сообщения / события от службы (ко всем сеансам Windows) - PullRequest
0 голосов
/ 27 июня 2011

Функции управления устройствами Windows «предоставляют способ единообразного уведомления всех приложений и компонентов системы об изменениях, которые могут повлиять на их работу или доступ к ресурсам».

У меня есть служба, которая должна предоставлять уведомления об определенных событиях любым заинтересованным приложениям и службам. Этот API выглядит идеально подходящим, потому что заинтересованные приложения / службы могут выбрать получение широковещательных сообщений с помощью RegisterDeviceNotification (), и отправителю не нужно вести список клиентов.

Тип события DBT_CUSTOMEVENT представляется правильным, но он может отправляться только драйверами режима ядра. К счастью, есть DBT_USERDEFINED. Документация говорит, что это должно быть отправлено, используя BroadcastSystemMessage().

Но затем коллега напомнил мне о «нулевой изоляции сеанса» в Windows Vista. Сможет ли BroadcastSystemMessage() из WM_DEVICECHANGE обращаться к приложениям, работающим во всех сеансах, а также к другим службам?

Похоже, что вопрос не возникает для драйверов ядра, потому что они используют другую функцию для отправки сообщения . Но мои уведомления исходят от службы, а не от драйвера ядра.

Я лаю не на том дереве? Я знаю, что могу использовать именованные каналы, но я действительно хочу, чтобы механизм широковещания делал вещи максимально простыми. Я не хочу, чтобы служба, генерирующая сообщения, беспокоилась о том, куда они направляются. Я также хочу избегать сторонних библиотек. Я хочу сделать это правильным способом, одобренным Microsoft, и не изобретать велосипед заново.

1 Ответ

1 голос
/ 30 июня 2011

Согласно документации для BroadcastSystemMessage() вы можете включить флаг BSM_ALLDESKTOPS, который будет выглядеть так, как вам нужно. Требуется привилегия SE_TCB_NAME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...