Если вы хотите, чтобы работающая программа выполняла код при выходе из системы, вам следует перехватить сообщение WM_QUERYENDSESSION
и найти значение lParam
ENDSESSION_LOGOFF
(0x80000000).
Важно проверить это значение lParam
, потому что другие указывают на «принудительное закрытие» - т. Е. Ваш процесс может быть остановлен до того, как ваш код будет даже запущен. На самом деле, большинство сообщений о завершении работы / завершении сеанса предназначены только для того, чтобы дать вам возможность запустить код очистки в последнюю минуту, и на них небезопасно реагировать длительными действиями; но эта конкретная комбинация должна быть в порядке.
Примечание. Я никогда не пытался запустить отдельный процесс в ответ на сообщение WM_QUERYENDSESSION
. Возможно, что оконный менеджер запретит это, как это происходит во время выключения. Попробуйте и посмотрите, я думаю.
Если вы находитесь в среде .NET (вы не указали), более быстрый способ - добавить обработчик события к событию Microsoft.Win32.SystemEvents.SessionEnding
.