點關閉按鈕關閉程序和在任務管理器中選結束任務有什麼區別?


瀉藥。以下回答只是憑記憶,沒有認真求證過。

點程序右上角關閉按鈕,結果是發送WM_CLOSE的窗口消息給程序自身的消息循環,程序自己響應這個消息自己退出,這樣的好處是程序有機會在退出前做點事,比如存個盤什麼的。

任務管理器裡面在任務欄結束任務,如果這個任務是前台的(有主窗口有消息循環),貌似會先發送WM_CLOSE給主窗體,這樣給程序一個機會正常退出。如果在一定時間內沒有結束,則會進一步處理,這裡我不清楚會用哪種方式,有可能直接ExitProcess了,也有可能先試下發送其他的窗口消息比如WM_QUIT。你可以試下開個記事本,打點字,然後去這樣結束任務。你會看到記事本先彈出了問你要不要保存的對話框,然後馬上就自動退出了。這說明程序還是有機會做些事的但是不會一直等下去。

任務管理器裡面在進程(詳細)頁結束任務,是直接ExitProcess的,這時候會先給你一個警告,因為直接ExitProcess代表程序本身沒有機會正常退出。


關閉按鈕的作用如 @Tim Chen 所述。

Windows 7 任務管理器結束任務的流程:

  • CTaskPage::HandleWMCOMMAND 處理結束任務按鈕按下事件

  • CTaskPage::GetHWNDS 獲取當前選中的窗口句柄列表

  • 遍歷窗口句柄列表,執行以下操作

  • GetKeyState(VK_CONTROL) 判斷 Ctrl 鍵是否按下,如果按下,強制結束置為 TRUE

  • 創建新線程 EndTaskThreadProc,傳入被關閉窗口的桌面、窗口句柄、進程ID、強制結束標誌位,開始執行結束操作

  • TmGetProcessStatus 遍歷目標窗口進程的每一個線程,調用 GetThreadWaitChain 檢測是否存在死循環,如果存在,強制結束置為 TRUE

  • SetThreadDesktop 將當前線程切換到目標窗口所在桌面

  • 如果強制結束為 FALSE,用 SendMessageTimeoutW 向目標窗口發送 WM_CLOSE 消息,設置超時 500 毫秒

  • 如果超時,用 EndTask 關閉目標窗口,傳入強制結束標誌位 FALSE

  • 如果強制結束不為 FALSE,用 EndTask 關閉目標窗口,傳入強制結束標誌位 TRUE

EndTask 結束任務的流程:

  • 用 CsrClientCallServer 向 csrss.exe 進程發起遠程調用,對應的 API 為 SrvEndTask

  • csrss.exe 以一個長者(NT AUTHORITYSYSTEM)的身份切到目標窗口桌面,根據傳入的強制結束標誌位決定向其 Owner 窗口發送 WM_CLOSE 消息(ThreadShutdownNotify)或者用 NtTerminateProcess 結束對應進程

所以當在任務管理器中按下 Ctrl 鍵並點擊結束任務按鈕時,相當於直接結束目標窗口對應的進程。


推薦閱讀:

現在國內缺乏優秀自主的桌面系統,為什麼沒有團隊或者公司試水chromium os?
現在還使用微軟的DOS操作系統是什麼體驗?
國內有哪些研發資料庫的公司?
Win有沒有可能完全反盜版?
PC下一次的技術革命會在那些方面?

TAG:操作系統 | 編程 | 任務管理器 |