先看一道題目:
當用戶(hù)點(diǎn)擊右上角關(guān)閉按鈕的時(shí)候,請給下列Windows做出的響應排個(gè)序:A:發(fā)送 WM_QUIT 消息 B:發(fā)送 WM_CLOSE 消息 C:發(fā)送 WM_DESTROY 消息 D:發(fā)送 WM_NCDESTROY 消息 F:發(fā)送 WM_COMEBABY 消息
答案是:WM_CLOSE,WM_DESTROY WM_NCDESTROY,WM_QUIT WM_CLOSE。(忽略WM_COMEBABY)
以下是我的測試圖片,發(fā)現響應WM_CLOSE之后,就不會(huì )響應其他的消息了。

既然點(diǎn)擊右上角關(guān)閉按鈕,會(huì )發(fā)送這么多消息,那么為什么之后不會(huì )去WM_DESTROY那里呢?
點(diǎn)擊右上角關(guān)閉按鈕,依次會(huì )產(chǎn)生WM_CLOSE,WM_DESTROY WM_NCDESTROY,WM_QUIT WM_CLOSE被攔截之后,后面的消息都不響應了嗎?
真實(shí)的情況是這樣的:
點(diǎn)擊右上角關(guān)閉按鈕,依次會(huì )產(chǎn)生WM_CLOSE,WM_DESTROY WM_NCDESTROY,WM_QUIT 。但是這4個(gè)消息并非是由點(diǎn)擊右上角關(guān)閉按鈕直接產(chǎn)生的。
點(diǎn)擊右上角關(guān)閉按鈕直接產(chǎn)生的,僅僅是WM_CLOSE消息,如果我們沒(méi)有去捕獲WM_CLOSE,或者捕獲后使用的是break而不是return,那么DefWindowProc有機會(huì )執行。
DefWindowProc是一個(gè)會(huì )產(chǎn)生消息的函數,當WM_CLOSE消息產(chǎn)生之后,如果去執行了DefWindowProc函數,那么他會(huì ) 接著(zhù)依次連續產(chǎn)生WM_DESTROY WM_NCDESTROY這兩個(gè)消息。
而在WM_DESTROY處理函數中寫(xiě)上了PostQuitMessage(0)這個(gè)函數,WM_QUIT 是由這個(gè)函數參數的。WM_QUIT這個(gè)消息 在過(guò)程函數(WndProc)中無(wú)法捕捉到,因為在GetMessage的時(shí)候捕獲到WM_QUIT 時(shí)返回值為0,就會(huì )導致主函數退出了。
所以,整個(gè)過(guò)程就是:
1、點(diǎn)擊右上角關(guān)閉按鈕,產(chǎn)生WM_CLOSE消息。
2、DefWindowProc(hwnd, message, wParam, lParam);被調用產(chǎn)生WM_DESTROY WM_NCDESTROY這兩個(gè)消息。
3、WM_DESTROY WM_NCDESTROY(如果你捕獲了)的處理函數會(huì )被執行,在執行WM_DESTROY處理函數是調用PostQuitMessage(0) 產(chǎn)生了WM_QUIT 消息。
4、GetMessage的時(shí)候捕獲到WM_QUIT 時(shí)返回值為0,就會(huì )導致主函數退出了。
聯(lián)系客服