DefWindowProc是乙個會產生訊息的函式

2022-03-04 17:16:58 字數 1288 閱讀 8821

先看一道題目:

當使用者點選右上角關閉按鈕的時候,請給下列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,就會導致主函式退出了。

一 什麼是專案

pmp指的是專案管理專業人士資格認證。它是由美國專案管理協會 project management institute pmi 發起的,嚴格評估專案管理人員知識技能是否具有高品質的資格認證考試。其目的是為了給專案管理人員提供統一的行業標準。pmp作為專案管理資格認證考試,已在國際上樹立了其權威性。全...

(一)什麼是MQ

mq就是訊息佇列,有3個比較重要的好處 解耦 非同步 削峰 不使用mq 耦合 系統a與bcd之間的通訊,全部需要在系統a裡面呼叫介面 如果又增加了系統e,那麼系統a需要增加呼叫e的介面的 如果系統b不需要與a通訊了,那麼需要在系統a裡面去掉相應 那麼開發系統a的兄弟可能要崩潰,系統a與其他系統產生了...

什麼是Mybatis Mybatis(一)

在學mybatis之前,首先要了解什麼是框架,框架是整個或者部分系統的可重用涉及,表現為一組抽象構件及構件例項之間互動的方法,還有一種定義認為,框架是可以被應用開發者定製的應用骨架。前者是從應用和方面,而後者是從目的方面給出的定義。簡而言之,框架就是某種應用的半成品,就是一組元件。而且框架一般是成熟...