windows訊息機制
2023年04月21日
一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個「訊息佇列」,即應用程式佇列,用來存放該程式可能建立的各種視窗的訊息。應用程式中含有一段稱作「訊息迴圈」的**,用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。[b]
二 windows為當前執行的每個windows程式維護乙個「訊息佇列」。在發生輸入事件之後,windows將事件轉換為乙個「訊息」並將訊息放入程式的訊息佇列中。程式通過執行一塊稱之為「訊息迴圈」的程式**從訊息佇列中取出訊息:
while(getmessage (&msg, null, 0, 0))
[/b]
[b]msg變數是型態為msg的結構,型態msg在winuser.h中定義如下:
typedef struct tagmsg
msg, * pmsg ;
point資料型態也是乙個結構,它在windef.h中定義如下:
typedef struct tagpoint
point, * ppoint;
translatemessage(&msg); 將msg結構傳給windows,進行一些鍵盤轉換。(關於這一點,我們將在第六章中深入討論。)
dispatchmessage(&msg);又將msg結構回傳給windows。然後,windows將該訊息傳送給適當的視窗訊息處理程式,讓它進行處理。這也就是說,windows將呼叫視窗訊息處理程式。在hellowin中,這個視窗訊息處理程式就是wndproc函式。處理完訊息之後,wndproc傳回到windows。此時,windows還停留在dispatchmessage呼叫中。在結束dispatchmessage呼叫的處理之後,windows回到hellowin程式中,並且接著從下乙個getmessage呼叫開始訊息迴圈。
三 佇列化訊息與非佇列化訊息
訊息能夠被分為「佇列化的」和「非佇列化的」。佇列化的訊息是由windows放入程式訊息佇列中的。在程式的訊息迴圈中,重新傳回並分配給視窗訊息處理程式。非佇列化的訊息在windows呼叫視窗時直接送給視窗訊息處理程式。也就是說,佇列化的訊息被「傳送」給訊息佇列,而非佇列化的訊息則「傳送」給視窗訊息處理程式。任何情況下,視窗訊息處理程式都將獲得視窗所有的訊息--包括佇列化的和非佇列化的。視窗訊息處理程式是視窗的「訊息中心」。[/b]
[b]佇列化訊息基本上是使用者輸入的結果,以擊鍵(如wm_keydown和wm_keyup訊息)、擊鍵產生的字元(wm_char)、滑鼠移動(wm_mousemove)和滑鼠按鈕(wm_lbuttondown)的形式給出。佇列化訊息還包含時鐘訊息(wm_timer)、更新訊息(wm_paint)和退出訊息(wm_quit)。[/b]
[b]非佇列化訊息則是其它訊息。在許多情況下,非佇列化訊息來自呼叫特定的windows函式。例如,當winmain呼叫createwindow時,windows將建立視窗並在處理中給視窗訊息處理程式傳送乙個wm_create訊息。當winmain呼叫showwindow時,windows將給視窗訊息處理程式傳送wm_size和wm_showwindow訊息。當winmain呼叫updatewindow時,windows將給視窗訊息處理程式傳送wm_paint訊息。鍵盤或滑鼠輸入時發出的佇列化訊息訊號,也能在非佇列化訊息中出現。例如,用鍵盤或滑鼠選擇了乙個選單項時,鍵盤或滑鼠訊息就是佇列化的,而說明選單項已選中的wm_command訊息則可能就是非佇列化的。[/b]
[b]四 sendmessage()與postmessage()之間的區別是什麼?
它們兩者是用於向應用程式傳送訊息的。postmessagex()將訊息直接加入到應用程式的訊息佇列中,不等程式返回就退出;而sendmessage()則剛好相反,應用程式處理完此訊息後,它才返回。我想下圖能夠比較好的體現這兩個函式的關係:
[/b]
[b]五 函式peekmessage和getmessage的區別?[/b]
[b]兩個函式主要有以下兩個區別:
1.getmessage將等到有合適的訊息時才返回,而peekmessage只是撇一下訊息佇列。
2.getmessage會將訊息從佇列中刪除,而peekmessage可以設定最後乙個引數wremovemsg來決定是否將訊息保留在佇列中。[/b]
windows訊息機制
一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...
windows訊息機制
一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...
Windows訊息機制
訊息佇列分為 系統訊息佇列 執行緒訊息佇列 應用程式訊息佇列 系統訊息佇列 這是系統唯一的佇列,輸入裝置 滑鼠 鍵盤等 的驅動程式把使用者的操作轉換成訊息的形式放置到系統佇列中,然後系統會把此訊息轉到目標視窗所在的執行緒訊息佇列中等待處理。執行緒訊息佇列 每個gui 圖形使用者 介面 graphic...