Как захватить сеанс выхода из службы Windows - PullRequest
2 голосов
/ 08 мая 2011

У меня есть служба, которая постоянно проверяет какое-то приложение и уверяет, что оно не было закрыто.Если это приложение закрыто - сервис запускает его снова.

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

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

Мой сервис запущен под учетной записью LocalSystem.

Спасибо.

ps Я не знаюиметь доступ к исходному коду приложения.Цель должна быть достигнута без ее изменения.

Ответы [ 4 ]

2 голосов
/ 08 мая 2011

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

0 голосов
/ 09 мая 2011

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

0 голосов
/ 09 мая 2011

У вас может не быть доступа к исходному коду исполняемого файла , но это не значит, что вы не можете повлиять на процесс .Например, вы можете ввести DLL .Используя SetWindowsHookEx, вы поймаете WM_ENDSESSION, отправленное в главное окно приложения.

0 голосов
/ 08 мая 2011

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

...