Работает ли API SendNotifyMessage между сеансами пользователей?

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

PS. Я программирую с использованием C++/MFC и собственных WinAPI.


person ahmd0    schedule 18.04.2012    source источник


Ответы (1)


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

Вы можете попробовать следующий подход:

  • Пройдите все сеансы (WTSEnumerateSessions), чтобы получить все WindowStation,
  • Откройте эти станции (OpenWindowStation),
  • Per station
    • Associate your process with the station (SetProcessWindowStation),
    • Пройтись по всем рабочим столам станции (Enumdesktops),
    • Пройдите через все окна (EnumdesktopWindows), пока не найдете одно из окон вашего приложения.

У вас, вероятно, будут проблемы с UAC.

person Flot2011    schedule 18.04.2012
comment
Спасибо за ваш вклад. Я только что научился этому на собственном горьком опыте, попробовав )) Итак, да, я могу подтвердить, что описанный выше метод НЕ будет работать. Хотелось бы, чтобы это было указано в документации к этому API... Ну, думаю, вернемся к глобальным событиям. Хотелось бы, чтобы они упростили взаимодействие между службами Windows и процессами пользовательского режима... - person ahmd0; 18.04.2012
comment
Способ связи между службой и процессом пользовательского режима заключается в том, что процесс пользовательского режима подключается к службе через COM или RPC. Так работают стандартные системные службы. - person Raymond Chen; 01.05.2012