Существуют ли особые условия для службы Windows для отправки сообщений в пользовательские окна? - PullRequest
1 голос
/ 05 марта 2009

Мне нужно написать приложение службы Windows (без графического интерфейса), которое будет следить за событием и, если оно произойдет, отправит стандартное сообщение Windows приложению. Дескриптор приложения будет передан службе DLL, которая затем выгружается, поэтому мы хотим использовать сообщение Windows.

Вопрос в том, нужно ли службе делать что-то особенное, чтобы использовать SendMessage для дескриптора окна, учитывая, что он может быть на другом экране или что-то в Vista. Возможно ли это, и если да, то что мне делать, пожалуйста?

1 Ответ

7 голосов
/ 05 марта 2009

Изоляция привилегий пользовательского интерфейса (UIPI):

Microsoft Windows Vista и более поздние версии. Отправка сообщения зависит от пользователя Изоляция привилегий интерфейса (UIPI). Поток процесса может отправить сообщения только в очереди сообщений темы в процессах меньшего или равный уровень целостности.

Источник

Вы можете прочитать о Изоляция привилегий интерфейса пользователя (UIPI) здесь .

Чтобы обойти это, вы можете установить для uiAccess значение true в файле манифеста. Вы также должны убедиться, что ваше приложение подписано с использованием authenticode с сертификатом от подписывающего органа, такого как VeriSign. Это может стать довольно дорогим.


Изоляция сеанса 0:

Я также считаю, что вы не можете вызывать SendMessage между сеансами. Так что если у вас есть служба, запущенная в сеансе 0, вам нужно найти другое средство для связи с вашим процессом, которое будет работать в сеансе> 0. Пример: через канал.

В Windows Vista, Windows 2008 Server и более поздних версиях все службы работают в сеансе 0, а все приложения, которые вы запускаете, работают в сеансе> 0. Это называется изоляцией сеанса 0. Вот хороший документ, который содержит информацию о изоляции сеанса 0 .

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


Общий:

Если вы разрабатываете свое приложение на pre-Vista и оно работает нормально. Существует очень высокий шанс того, что он будет сломан в Vista.

...