Я создал службу Windows для запуска моего пользовательского приложения с помощью createProcessAsUser. Результатом является одно приложение, работающее с пользователем SYSTEM в сеансе с идентификатором 0, как я и ожидал. Моя проблема в том, что мне нужно иметь связь между этим приложением и другим, созданным текущим пользователем.
Если произошли какие-либо события на рабочем столе (SC_SCREENSAVE, отключение монитора), события, перехваченные текущими пользовательскими приложениями, я должен сообщить об этом своему приложению SYSTEM. Я использовал:
SendMessage (HWND_BROADCAST, CURRENT_USER_HAS_DONE_SOMETHING, 0, 0);
Даже приложение SYSTEM перехватывает много системных событий (приостановка, выход из системы …) и работает с тем же идентификатором сеанса, мои пользовательские сообщения никогда не перехватываются. Кажется, что Sendmessage не работает для пользователя SYSTEM.
Как я могу отправить сообщение от текущего сеанса пользователя в приложение SYSTEM?
Другим вариантом является использование старого Функция ControlService вместе с определяемым пользователем кодом управления. Он не подходит для сложной связи (вы не можете передать какие-либо параметры в службу), но он хорошо работает для простых уведомлений «что-то произошло», которые вы наметили.
Очевидно, что трансляция сообщений не является правильным решением. Хорошее решение, вероятно, CreateEventEx
, Это создает именованное событие. Ваше обычное приложение может позвонить SetEvent
и SYSTEM
Приложение может ждать этого события.
Последние версии Windows не позволяют обмениваться сообщениями между сеансами 0 и сеансами рабочего стола. Это называется Сессия 0 изоляция.
Вы можете найти больше информации Вот а также Вот.
Обычными альтернативами являются TCP / IP, каналы, удаленное взаимодействие и т. Д., Которые описаны в этот так ответ.