Как симулировать выключение Windows для отладки? - PullRequest
47 голосов
/ 06 февраля 2009

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

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

Ответы [ 4 ]

57 голосов
/ 20 апреля 2010

В инструментах тестирования логотипов Microsoft для Windows есть инструмент под названием «Перезагрузить менеджер» (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»,

Сообщения о завершении работы диспетчера перезапуска:

а. WM_QUERYENDSESSION с LPARAM = ENDSESSION_CLOSEAPP (0x1): приложения с графическим интерфейсом должны немедленно ответить (ИСТИНА), чтобы подготовиться к перезапуску.

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

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

7 голосов
/ 06 февраля 2009

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

0 голосов
/ 08 марта 2018

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

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

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

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

0 голосов
/ 06 февраля 2009

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

...