Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

В Инструментах тестирования логотипов 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] - идентификатор процесса. В соответствии с документом о проверке тестовых случаев логотипа Vista,

Сообщения о завершении работы Restart Manager:

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

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

с. CTRL_SHUTDOWN_EVENT: Консольные приложения должны немедленно отключиться.

Ответ 2

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

Ответ 3

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