今天,閑著無事,就把Windows消息窗口章節又看了一遍,發現原來自己還有很多不懂的東西。 寫于此以備錄警示。
關于消息隊列有兩種,一種是系統消息隊列,另一種是線程消息隊列。windows應用程序的運行需要依靠外部發生的事件來驅動。應用程序通過輸入消息來接受輸入。操作系統負責監視所有設備并將輸入消息放入一個先進先出的隊列中,即系統消息隊列。接著,windows從系統消息隊列中去走一條消息,確定目的窗口,并將消息送入創建該窗口的消息隊列中。
并不是每一個線程都有消息隊列,只有當線程調用一個與圖形用戶界面有關的函數,系統才會為線程分配一個THREADINFO結構,并將這個數據結構與線程聯系起來。該結構記錄的各種消息的分類。
對于該結構中,消息分為:1。登記消息隊列(如:PostMessage發送的消息)2。虛擬輸入隊列(wm_keyup,wm_mousemove)3。發送的消息(SendMessage發送的消息)。4。其他 如wm_paint,wm_timer
處理消息的算法:
對于windows來說,當調用getMessage或PeekMessage時,按下列順序從消息隊列中獲得消息進行處理:
1)首先處理sendMessage發送的消息
2)接著處理PostMessage發送的消息
3)檢查是否有WM_QUIT消息
4)處理虛擬消息隊列
5)如果有WM_PAINT消息,就處理
6)如果有WM_TIMER消息,就處理
windows處理判斷處理順序時,察看的是標志位(以QS_*描述的一些消息標志),利用這些標志位,來確定是否對應的消息隊列中有對應的消息。