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