DefWindowProc是一個會產生消息的函數


先看一道題目:

  當用戶點擊右上角關閉按鈕的時候,請給下列Windows做出的響應排個序:A:發送 WM_QUIT 消息     B:發送 WM_CLOSE 消息     C:發送 WM_DESTROY 消息     D:發送 WM_NCDESTROY 消息     F:發送 WM_COMEBABY 消息

答案是:WM_CLOSE,WM_DESTROY  WM_NCDESTROY,WM_QUIT WM_CLOSE。(忽略WM_COMEBABY)

  以下是我的測試圖片,發現響應WM_CLOSE之后,就不會響應其他的消息了。

  既然點擊右上角關閉按鈕,會發送這么多消息,那么為什么之后不會去WM_DESTROY那里呢?

  點擊右上角關閉按鈕,依次會產生WM_CLOSE,WM_DESTROY  WM_NCDESTROY,WM_QUIT WM_CLOSE被攔截之后,后面的消息都不響應了嗎?

  

  

     真實的情況是這樣的:

    點擊右上角關閉按鈕,依次會產生WM_CLOSE,WM_DESTROY  WM_NCDESTROY,WM_QUIT 。但是這4個消息並非是由點擊右上角關閉按鈕直接產生的。

        點擊右上角關閉按鈕直接產生的,僅僅是WM_CLOSE消息,如果我們沒有去捕獲WM_CLOSE,或者捕獲后使用的是break而不是return,那么DefWindowProc有機會執行。

        DefWindowProc是一個會產生消息的函數,當WM_CLOSE消息產生之后,如果去執行了DefWindowProc函數,那么他會 接着依次連續產生WM_DESTROY  WM_NCDESTROY這兩個消息。

        而在WM_DESTROY處理函數中寫上了PostQuitMessage(0)這個函數,WM_QUIT 是由這個函數參數的。WM_QUIT這個消息 在過程函數(WndProc)中無法捕捉到,因為在GetMessage的時候捕獲到WM_QUIT 時返回值為0,就會導致主函數退出了。                

所以,整個過程就是:

1、點擊右上角關閉按鈕,產生WM_CLOSE消息。

2、DefWindowProc(hwnd, message, wParam, lParam);被調用產生WM_DESTROY  WM_NCDESTROY這兩個消息。

3、WM_DESTROY  WM_NCDESTROY(如果你捕獲了)的處理函數會被執行,在執行WM_DESTROY處理函數是調用PostQuitMessage(0) 產生了WM_QUIT 消息。

4、GetMessage的時候捕獲到WM_QUIT 時返回值為0,就會導致主函數退出了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM