2012-02-28 66 views
7

我有這個MFC程序,當我用任務管理器殺死它時,我得到我的程序異常,然後崩潰。任務管理器如何殺死我的程序?

我想從任務管理器中獲取事件,當它要殺死我的進程並優雅地關閉我的程序時。

我知道任務管理器爲了殺死一個進程而使用的方法很少。

1)從應用程序選項卡,有人告訴我它正在嚮應用程序的主要可見窗口發送WM_CLOSE消息,並且如果我的應用程序在幾秒鐘後不會關閉,任務管理器會將其檢測爲不響應並使用TerminateProcess ()的過程。

2)從進程選項卡,有人告訴我它正在使用TerminateProcess()Windows API。

任務管理器正在使用其他方法嗎?

我說的最後2種方法嗎?

預先感謝您。

回答

8

是的,這兩個都是正確的。您應該回應WM_CLOSE以優雅地關閉。這可能來自任何地方,而不僅僅是任務管理器(例如關機)。

MFC通常處理WM_CLOSE。如果你的應用程序沒有響應,那麼你的主線程必須做其他事情,或者更可能來自你的描述在WM_CLOSE處理程序中的某處崩潰。

你可以調試你的應用程序來找到引發異常的位置嗎?

+1

謝謝,我真的沒有迴應任務管理器發送的WM_CLOSE消息。我找到了'afx_msg void OnClose();的一個EMPTY實現'''我所要做的就是調用基類的OnClose實現。 – eladyanai 2012-02-28 14:52:17

1

當你得到一個WM_CLOSE時,你可以很容易地檢測到,這樣你的應用程序就可以處理它。

我不相信有可能知道什麼時候TerminateProcess被調用來殺死你的應用程序。 TerminateProcess文檔說它是目標進程的立即和無條件關閉。

(取決於你多麼想實現這一點,看看this link約掛接到Windows API,但不要指望它很容易。)

+0

感謝您的回答,實際上,我沒有迴應由任務管理器發送的WM_CLOSE-從應用程序選項卡中殺掉我的進程。 從進程選項卡(通過TerminateProcess函數)殺死我的進程沒有讓我的應用程序崩潰。 – eladyanai 2012-02-28 08:58:05

3

是的,這些都是選項。

爲了完整起見,請注意,當單擊「結束任務」按鈕時,控制檯模式應用程序將獲得您可以對其作出反應的CTRL_CLOSE_EVENT發送。

請注意,您不能攔截或反應TerminateProcess。你的過程將會消失,在這種情況發生之前你無能爲力。其實,這將是pretty bad if you could。因爲那樣就沒有辦法終止一個失控的進程。

+0

很好知道!非常感謝你,我同意TerminateProcess的解釋。 – eladyanai 2012-02-28 09:00:42

1

任務管理器內部使用EndTask函數。該功能會將WM_CLOSE消息發送給您的應用程序。如果您的應用程序未響應該消息並且用戶強制終止您的應用程序,則在您的過程中調用TerminateProcess

相關問題