Как имитировать завершение работы Windows для отладки?

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

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

4 ответов


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

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:

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

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

c. CTRL_SHUTDOWN_EVENT: консольные приложения должен остановлен.


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


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


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

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

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

  2. Отправить сообщение WM_ENDSESSION С LPARAM = ENDSESSION_CLOSEAPP Приложение должно быть закрыто в пределах указанного таймаут.