2009-02-06 3 views
45

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

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

ответ

58

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

Restart Shutdown Manager сообщения являются:

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

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

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

+0

потрясающий! (Я еще не пробовал - если кто-то использует его и может предоставить отзывы, что было бы замечательно) – Rory

+2

Ваша ссылка не работает. Инструменты тестирования логотипа были частью старой программы Windows 7 Client Software Logo. Эти инструменты больше не находятся на веб-сайте Microsoft. Инструменты, похоже, были заменены набором сертификации приложений Windows, который является частью программы сертификации приложений Windows 10 Desktop App. В комплект не входит 'rmtool.exe', только' rmlogotest.exe'. Я немного написал о 'rmlogotest.exe' в другом месте; чтобы прочитать то, что я написал, следуйте [этой ссылке] (http://superuser.com/questions/959364/on-windows-how-can-i-gracefully-ask-a-running-program-to-terminate# 1154058). – unforgettableid

+0

'rmlogotest.exe' отправляет сообщения в ваше приложение, и я подозреваю, что они те же сообщения, что и' rmtool.exe', которые были отправлены, но я не проверял их. – unforgettableid

6

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

+1

Кроме того, WM_QueryEndSession сопровождается (учитывая все-ОК приложениями, которые его получают) WM_EndSession. – JMD

+0

Отлично - спасибо за разъяснение JMD. Я подумал, что должно быть дополнительное сообщение, но я не был уверен, что это такое. –

+0

Какие-нибудь полезные утилиты, которые я могу использовать для отправки таких сообщений, а не для их создания? – Rory

0

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

+0

Как вы можете имитировать выключение, чтобы попробовать то, что вы написали? – KansaiRobot

0

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

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

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

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

Смежные вопросы