一、从Windows消息机制说起
生活随笔
收集整理的這篇文章主要介紹了
一、从Windows消息机制说起
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
一,消息
消息(Message)指的就是Windows 操作系統(tǒng)發(fā)給應(yīng)用程序的一個(gè)通知,它告訴應(yīng)用程序某個(gè)特定的事件發(fā)生了。比如,用戶單擊鼠標(biāo)或按鍵都會(huì)引發(fā)Windows 系統(tǒng)發(fā)送相應(yīng)的消息。最終處理消息的是應(yīng)用程序的窗口函數(shù),如果程序沒處理的話操作系統(tǒng)有默認(rèn)函數(shù)將會(huì)作出處理。? ? ?從數(shù)據(jù)結(jié)構(gòu)的角度來說,消息是一個(gè)結(jié)構(gòu)體,它包含了消息的類型標(biāo)識(shí)符以及其他的一些附加信息。系統(tǒng)定義的結(jié)構(gòu)體MSG用于表示消息,MSG 具有如下定義形式:
typedef struct MSG
{
? ? ?HWND hwnd; ? ? ? ? ? ? ? ? ? ?//hwnd 是窗口的句柄,這個(gè)參數(shù)將決定由哪個(gè)窗口過程函數(shù)對(duì)消息進(jìn)行處理?
? ? ?UINT message; ? ? ? ? ? ? ? ? ?//message是一個(gè)消息常量,用來表示消息的類型?
? ? ?WPARAM wParam; ? ? ? ? ? ?//32 位的附加信息,具體表示什么內(nèi)容,要視消息的類型而定?
? ? ?LPARAM lParam; ? ? ? ? ? ? ? //32 位的附加信息,具體表示什么內(nèi)容,要視消息的類型而定?
? ? ?DWORD time; ? ? ? ? ? ? ? ? ? //time 是消息發(fā)送的時(shí)間?
? ? ?POINT pt; ? ? ? ? ? ? ? ? ? ? ? ? //消息發(fā)送時(shí)鼠標(biāo)所在的位置?
} 二,Windows編程原理 Windows 是一消息(Message)驅(qū)動(dòng)式系統(tǒng),Windows 消息提供了應(yīng)用程序與應(yīng)用程序之間、應(yīng)用程序與Windows 系統(tǒng)之間進(jìn)行通訊的手段。應(yīng)用程序要實(shí)現(xiàn)的功能由消息來觸發(fā),并靠對(duì)消息的響應(yīng)和處理來完成。Windows 系統(tǒng)中有兩種消息隊(duì)列,一種是系統(tǒng)消息隊(duì)列,另一種是應(yīng)用程序消息隊(duì)列。計(jì)算機(jī)的所有輸入設(shè)備由 Windows 監(jiān)控,當(dāng)一個(gè)事件發(fā)生時(shí),Windows 先將輸入的消息放入系統(tǒng)消息隊(duì)列中,然后再將輸入的消息拷貝到相應(yīng)的應(yīng)用程序隊(duì)列中,應(yīng)用程序中的消息循環(huán)從它的消息隊(duì)列中檢索每一個(gè)消息并發(fā)送給相應(yīng)的窗口函數(shù)中。 箭頭1 說明操作系統(tǒng)能夠操縱輸入輸出設(shè)備,例如讓打印機(jī)打印; 箭頭2 說明操作系統(tǒng)能夠感知輸入輸出設(shè)備的狀態(tài)變化,如鼠標(biāo)單擊,按鍵按下等,這就是操作系統(tǒng)和計(jì)算機(jī)硬件之間的交互關(guān)系 箭頭3 是應(yīng)用程序通知操作系統(tǒng)執(zhí)行某個(gè)具體的操作,這是通過調(diào)用操作系統(tǒng)的API 來實(shí)現(xiàn)的; 箭頭4?操作系統(tǒng)能夠感知硬件的狀態(tài)變化,但是并不決定如何處理,而是把這種變化封裝成消息轉(zhuǎn)交給應(yīng)用程序,由應(yīng)用程序決定如何處理,箭頭4說明了這種轉(zhuǎn)交情況。 三,Windows消息循環(huán) 消息循環(huán)是Windows 應(yīng)用程序存在的根本,應(yīng)用程序通過消息循環(huán)獲取各種消息,并通過相應(yīng)的窗口過程函數(shù),對(duì)消息加以處理;正是這個(gè)消息循環(huán)使得一個(gè)應(yīng)用程序能夠響應(yīng)外部的各種事件。 Windows 操作系統(tǒng)為每個(gè)線程維持一個(gè)消息隊(duì)列,當(dāng)事件產(chǎn)生時(shí),操作系統(tǒng)感知這一事件的發(fā)生,并包裝成消息發(fā)送到消息隊(duì)列,應(yīng)用程序通過GetMessage()函數(shù)取得消息并存于一個(gè)消息結(jié)構(gòu)體中,然后通過一個(gè)TranslateMessage()和DispatchMessage()解釋和分發(fā)消息,下面的代碼描述了Windows 的消息循環(huán)。
while(GetMessage (&msg, NULL, 0, 0))
{
???? TranslateMessage (&msg) ;
???? DispatchMessage (&msg) ;
}
TranslateMessage(&msg)對(duì)于大多數(shù)消息而言不起作用,但是有些消息,比如鍵盤按鍵按下和彈起(分別對(duì)于KeyDown 和KeyUp 消息),卻需要通過它解釋,產(chǎn)生一個(gè)WM_CHAR消息。DispatchMessage(&msg)負(fù)責(zé)把消息分發(fā)到消息結(jié)構(gòu)體中對(duì)應(yīng)的窗口,交由窗口過程函數(shù)處理。GetMessage()在取得WM_QUIT 之前的返回值都為TRUE,也就是說只有獲取到WM_QUIT 消息才返回FALSE,才能跳出消息循環(huán)。
轉(zhuǎn)載于:https://www.cnblogs.com/h2zZhou/p/9475622.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的一、从Windows消息机制说起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何获得select被选中option的
- 下一篇: StarUML 破解方法2.X(转)