Как имитировать выключение Windows для отладки?

У меня проблема с моим приложением, когда Windows отключается – мое приложение не выходит красиво, в результате чего отображается окно конечной задачи. Как я могу использовать отладчик, чтобы узнать, что происходит?

Есть ли способ отправить сообщение о завершении работы Windows в мое приложение, поэтому он думает, что Windows выключается, поэтому я могу точно видеть, как он себя ведет?

В Инструментах тестирования логотипа Microsoft для Windows есть инструмент Restart Manager (rmtool.exe), который может использоваться для отправки выключения и перезапуска сообщений в процессе. Инструменты тестирования логотипов можно скачать здесь:

http://download.microsoft.com/download/d/2/5/d2522ce4-a441-459d-8302-be8f3321823c/LogoToolsv1.0.msi

Затем вы можете имитировать выключение для вашего процесса:

rmtool.exe -p [PID] -S 

где [PID] – идентификатор процесса. В соответствии с документом,

Сообщения об отключении перезапуска диспетчера:

а. WM_QUERYENDSESSION с LPARAM = ENDSESSION_CLOSEAPP (0x1): приложения GUI должны немедленно ответить (TRUE), чтобы подготовиться к перезапуску.

б. WM_ENDSESSION с LPARAM = ENDSESSION_CLOSEAPP (0x1): приложение должно завершить работу в течение 5 секунд (20 секунд для служб).

с. CTRL_SHUTDOWN_EVENT: Консольные приложения должны немедленно завершить работу.

Я считаю, что когда Windows выключается, он отправляет «WM_QueryEndSession» всем приложениям. Чтобы имитировать выключение Windows, вы можете создать небольшое приложение, которое просто отправляет сообщение PostMessage с этим сообщением в ваше приложение и узнает, что произойдет. Windows может отправлять больше сообщений, чем фактически закрыть ваше приложение (например, WM_CLOSE), но всякий раз, когда ваше приложение получает сообщение «WM_QueryEndSession», это означает, что ваше приложение собирается вынуть из него коврик.

Вы можете использовать событие SystemEvents.SessionEnding , которое запускается, когда пользователь выходит из системы или выключается. Будьте осторожны при использовании, хотя некоторые ресурсы не гарантируются. Например, моему приложению нужно было ударить по серверу, когда он отключился, чтобы синхронизировать пользователя (приложение тайм-блокировки), но сетевая карта иногда уже отключена, когда происходит это событие. Поскольку вы просто выполняете очистку, это должно работать нормально.

SendMessage может использоваться для отправки оконных сообщений с любыми параметрами в окно.

Очень полезно для отладки и тестирования.

  1. Отправьте сообщение WM_QUERYENDSESSION с помощью LPARAM = ENDSESSION_CLOSEAPP . Приложение должно вернуть 1 (ИСТИНА), чтобы указать, что оно готово к завершению и перезапуску.

  2. Отправить сообщение WM_ENDSESSION с LPARAM = ENDSESSION_CLOSEAPP Приложение должно завершить работу в течение указанного периода ожидания.