2009-02-06 19 views
45

當Windows關閉時,我的應用程序出現問題 - 我的應用程序無法正常退出,導致顯示「結束任務」窗口。我如何使用調試器來查看發生了什麼?如何模擬Windows關機進行調試?

有沒有辦法將Windows關機消息發送到我的應用程序,所以它認爲Windows正在關閉,所以我可以看到它的行爲?

回答

58

微軟的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]是進程ID。根據Vista的徽標認證測試用例文檔,

重啓管理器關閉消息是:

一個。 WM_QUERYENDSESSION與LPARAM = ENDSESSION_CLOSEAPP(0x1):GUI應用程序必須立即響應(TRUE)以準備重新啓動。

b。 WM_ENDSESSION與LPARAM = ENDSESSION_CLOSEAPP(0x1):應用程序必須在5秒內關閉(服務爲20秒)。

c。 CTRL_SHUTDOWN_EVENT:控制檯應用程序必須立即關閉。

6

我相信當Windows關閉時,它會向所有應用程序發送一個「WM_QueryEndSession」。要模擬Windows關機,您可以創建一個小應用程序,該應用程序只將PostMessage與此消息一起發送到您的應用程序並查看會發生什麼。 Windows可能會發送比實際關閉應用程序更多的消息(如WM_CLOSE),但每當應用程序收到「WM_QueryEndSession」消息時,這意味着您的應用程序即將從該應用程序下拉出地毯。

+1

此外,WM_EndSession遵循WM_QueryEndSession(由接收它的應用程序給出的全部OK)。 – JMD 2009-02-06 16:24:34

+0

非常好 - 謝謝澄清JMD。我認爲必須有一個額外的信息,但我不確定它是什麼。 – 2009-02-06 16:25:18

+0

任何有用的實用工具,我可以用來發送這樣的消息,而不是自己製作一個? – Rory 2009-02-06 16:28:28

0

您可以使用SystemEvents.SessionEnding事件,該事件在用戶註銷或關閉時觸發。使用它時要小心,但有些資源不能保證可用。例如,我的應用程序需要在關閉服務器時將服務器關閉(時鐘應用程序),但當發生此事件時,網卡有時已被禁用。既然你只是在做清理工作,這應該可以正常工作。

0

SendMessage可以用來發送帶有任何參數的窗口消息到一個窗口。

對於調試和測試非常有用。

  1. 發送郵件WM_QUERYENDSESSIONLPARAM = ENDSESSION_CLOSEAPP。 應用程序必須返回1(TRUE)以表明它準備關閉並重新啓動。

  2. 發送消息WM_ENDSESSION與LPARAM = ENDSESSION_CLOSEAPP 應用程序必須在指定的超時期限內關閉。

相關問題