不進隊訊息和進隊訊息
不進隊訊息和進隊訊息。不進隊訊息是指由Windows直接調用訊息處理函數,把訊息直接交給其處理。而進隊訊息是指Windows將訊息放入到程式中的訊息佇列中取,並通過程式中的訊息迴圈,迴圈把訊息取出,經過一定處理(如例子中經過translate),然後由函數DispathMessage函數將訊息分發給訊息處理函數處理。進隊訊息基本上是使用者的輸入:擊鍵的訊息(WM_KEYDOWN、WM_KEYUP)鍵盤輸入產生字元(WM_CHAR)、滑鼠移動(WM_MOUSEMOVE)、滑鼠鍵(WM_LBUTTONDOWN)、計時訊息(WM_TIMER)、重新整理訊息(WM_PAINT)和退出訊息(WM_QUIT)。不進隊訊息則是其他訊息。一般情況下,不進隊訊息的產生是由於調用了其他Windows函數。如,當調用CreateWindow時,Windows將建立WM_CREATE訊息、當調用ShowWindow時,將產生WM_SIZE和WM_SHOWWINDOW訊息、當調用UpdateWindow時建立的WM_PAINT訊息(注意,並不是某個類型是進隊訊息就永遠是進隊訊息,如WM_PAINT有進隊的,也有不進隊的)、還有其他進隊訊息也有可能在不進隊訊息中出現,整個處理過程是複雜的,但由於Windows已經解決大部分的問題,因此我們可以認為我們獲得的訊息是有序的、同步的。
發送訊息:SendMessage 和 PostMessage,SendMessage為發送“不進隊訊息”,直接調用處理函數處理,返回處理函數處理結果。PostMessage為發送“進隊訊息”。PostThreadMessage為向線程發訊息
訊息分為進隊訊息訊息和非進隊訊息。所謂進隊訊息就是windows將訊息發送到每個線程所專有的隊列中,然後由程式自主處理,這種訊息基本上是由使用者輸 入產生(wm_keydown,wm_keyup,wm_char,wm_mouse**,以及wm_paint,wm_timer,wm_quit)或
者是調用postmessage,postthreadmessage產生的訊息;所謂的非進隊訊息就是直接發送給視窗過程的訊息,就是直接調用視窗過 程,上述訊息以外的一般都是這種類型!
各種訊息是使用者和系統之間的互動,系統核心收集。轉寄給各個應用程式的訊息佇列。每個線程一個訊息佇列
在GetMessage時候如果第二個參數設為NULL接收屬於調用線程所有視窗的視窗訊息。,如果設定控制代碼,則只能接受相應的。作業系統核心有個訊息佇列。
一個線程一旦建立了至少一個視窗,則系統就為其分配一個訊息佇列。主要表現形式為系統為其分配一個THREADINFO結構,該結構有四個指標分別指向登 記訊息佇列,發送訊息佇列,應答訊息佇列和虛擬輸入隊列。如果想將訊息放入登記訊息佇列,可以調用postmessage,或者 postthreadmessage。其餘的訊息佇列主要用於處理如下的事務。當某線程調用sendmessage給別的線程建立的視窗時,發送的訊息首
先追加到接收線程的發送訊息佇列,發送線程處於空閑狀態,等待接收線程處理完他的訊息返回給發送線程的應答隊列,等到後發送線程被喚醒取得應答隊列的訊息 (就是處理完訊息的傳回值),繼續執行。而虛擬輸入隊列則是由windows的系統線程RIT(原始輸入線程)負責將硬體事件轉換成訊息添加到對應線程的 虛擬訊息佇列中。
處理訊息佇列的順序。首先windows絕對不是按隊列先進先出的次序來處理的,而是有一定優先順序的。優先順序通過訊息佇列的狀態標誌來實現的。首先最高優 先級的是別的線程發過來的訊息(通過sendmessage),其次是處理登記訊息佇列訊息,再次處理QS_QUIT標誌,再處理虛擬輸入隊列,再處理 wm_paint最後是wm_timer!