Как обнаружить выключение Windows или выход из системы - PullRequest
46 голосов
/ 23 июля 2011

Мне нужно определить, когда Windows завершает работу (или перезапускается) или когда пользователь выходит из системы.Мне нужно правильно закрыть приложение до его закрытия.Я заметил, что событие закрытия приложения не возникает, когда Windows закрывает день.

Я прочитал сообщение Есть ли способ в c # обнаружить Windows завершение работы / выход из системы и отменить это действие (после запроса пользователя)

но я не уверен, где мне следует выполнить операции перед закрытием.Спасибо.

Ответы [ 2 ]

53 голосов
/ 23 июля 2011

Присоедините метод обработчика события к событию SystemEvents.SessionEnding , и ваш метод обработчика будет вызываться каждый раз, когда событие вызывается. Обработка этого события позволит вам отменить ожидающий выход из системы или выключение, если хотите. (Хотя на самом деле это не работает так, как звучит в современных операционных системах; для получения дополнительной информации см. Документацию MSDN здесь .)

Если вы не хотите отменять событие, а просто реагировать на него соответствующим образом, вам следует обработать событие SystemEvents.SessionEnded .

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

9 голосов
/ 14 октября 2013

Вы можете использовать собственное решение с помощью pinvoke , если ваш код не выполняется в неинтерактивном сеансе (например, в системной службе):

//SM_SHUTTINGDOWN = 0x2000
bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...