Windows消息機制簡介_第1頁
Windows消息機制簡介_第2頁
Windows消息機制簡介_第3頁
Windows消息機制簡介_第4頁
Windows消息機制簡介_第5頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Windows消息機制簡介【摘要】Windows消息機制是Windows編程中至關(guān)重要的一部分。Windows消息機制中的消息是指Windows發(fā)出的一個通知,該通知告訴應用程序某個事情發(fā)生了。而且消息都有其固定的結(jié)構(gòu)信息。另外,Windows消息可以分為隊列消息和非隊列消息。隊列消息是把消息投遞到一個先進先出的消息隊列中,而非隊列消息是把消息直接發(fā)送給窗口過程。而在消息的發(fā)送過程中,存在兩種發(fā)送方式,分別是發(fā)送方式和寄送方式。對于Windows通過發(fā)送方式將消息存入系統(tǒng)消息隊列后,再將消息分配到對應的應用程序的消息隊列,此時通過消息循環(huán)讀取消息,再在消息循環(huán)中提請操作系統(tǒng)將該調(diào)用對應的窗口函數(shù)。一、什么是消息消息,就是指Widows發(fā)出的一個通知,告訴應用程序某個事情發(fā)生了。例如,當鼠標單擊某應用程序的一個按鈕。這時,Widows(操作系統(tǒng))給應用程序發(fā)送這個消息,通知應用程序該按鈕被點擊,應用程序?qū)⑦M行相應反應。消息本身是作為一個記錄傳遞給應用程序的,這個記錄(一般在C/Java/匯編中稱為“結(jié)構(gòu)體”)中包含了消息的類型以及其他信息。這個記錄類型叫做Msg。那么,我們先來介紹一下這個記錄的結(jié)構(gòu)信息。它在Windows中的聲明如下:TypedefstructtagMSG{HWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;}MSG,*PMSG;其中各數(shù)據(jù)成員的意義表示如下,hwnd:消息將要發(fā)送到的那個窗口的句柄,用這個參數(shù)可以決定讓哪個窗口接收消息。message:消息常量標識符,也就是我們常說的消息號。wParam:—個32位的消息參數(shù),這個值的確切意義取決于消息本身。lParam:一個32位的消息參數(shù),這個值的確切意義取決于消息本身。time:消息放入消息隊列中的時間,在這個域中寫入的并非當時日期,而是從Windows啟動后所測量的時間值。Windows用這個域來使用消息保持正確的順序。pt:消息放入消息隊列時的鼠標坐標。在上述的數(shù)據(jù)成員中,對于消息常量標識符,即消息號,我們再做解釋如下:消息常量標識符以常量命名方式指出消息的含義。這些常量標識符在頭文件winuser.h中被定義,例如,#defineWM_PAINTOxOOOF。當窗口過程接收到消息后,他就會使用消息常量標識符來決定如何處理消息。例如,WM_PAINT作為一個消息常量標識符告訴窗口過程窗體客戶區(qū)發(fā)生了改變需要重繪。消息常量標識符惟一地標示了一種消息類型。二、什么是隊列消息非隊列消息當我們要把外界的輸入通過驅(qū)動程序轉(zhuǎn)化成消息,然后Windows系統(tǒng)將該消息發(fā)送到指定的窗口函數(shù),那么,此時將存在兩種消息發(fā)送方式:把消息投遞到一個先進先出的消息隊列中,或者把消息直接發(fā)送給窗口函數(shù)。因此,我們便有了隊列消息和非隊列消息。消息隊列又分為系統(tǒng)消息隊列和線程消息隊列。系統(tǒng)消息隊列由Windows維護,線程消息隊列則由每個GUI線程自己進行維護。對于隊列消息,最常見的是鼠標和鍵盤觸發(fā)的消息,例如WM_CHAR,WM_MOUSERMOVE等消息,還有一些其它的消息,例如:WM_PAINT、WM_TIMER和WM_QUIT。當鼠標、鍵盤事件被觸發(fā)后,相應的鼠標或鍵盤驅(qū)動程序就會把這些事件轉(zhuǎn)換成相應的消息,然后輸送到系統(tǒng)消息隊列,由Windows系統(tǒng)去進行處理。Windows系統(tǒng)則在適當?shù)臅r機,從系統(tǒng)消息隊列中取出一個消息,根據(jù)前面我們所說的MSG消息結(jié)構(gòu)確定消息是要被送往那個窗口,然后把取出的消息送往創(chuàng)建窗口的線程的相應隊列,下面的事情就該由線程消息隊列操心了,Windows開始忙自己的事情去了。線程看到自己的消息隊列中有消息,就從隊列中取出來,通過操作系統(tǒng)發(fā)送到合適的窗口函數(shù)去處理。事件一驅(qū)動程序一消息一系統(tǒng)消息隊列一對應的線程隊列通過操作系統(tǒng)調(diào)用只對應的窗口函數(shù)對于非隊列消息,非隊列消息將會繞過系統(tǒng)隊列和消息隊列,直接將消息發(fā)送到窗口函數(shù)。系統(tǒng)發(fā)送非隊列消息通知窗口。例如,當用戶激活一個窗口系統(tǒng)發(fā)送WM_ACTIVATE,WM_SETFOCUS,WM_SETCURSOR。這些消息通知窗口它被激活了。非隊列消息也可以由當應用程序調(diào)用系統(tǒng)函數(shù)產(chǎn)生。例如,當程序調(diào)用SetWindowPos系統(tǒng)發(fā)送WM_WINDOWPOSCHANGED消息。那么,在消息的傳遞過程中,消息是以怎樣的方式發(fā)送的呢?三、消息的發(fā)送把一個消息發(fā)送到窗口有3種方式:發(fā)送,寄送和廣播。發(fā)送消息的函數(shù)有:SendMessage、SendMessageCallback、SendNotifyMessage、SendMessageTimeout;寄送消息的函數(shù)主要有PostMessage、PostThreadMessage、PostQuitMessage;廣播消息的函數(shù)有BroadcastSystemMessage、BroadcastSystemMessageEx。這里我們主要介紹SendMessage和PostMessage。SendMessage:函數(shù)原型:LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam);參數(shù):hWnd:其窗口程序接收消息的窗口的句柄。Msg:指定被寄送的消息。如WM_USERwParam:指定附加的消息特定的信息lParam:指定附加的消息特定的信息。函數(shù)功能:該函數(shù)將指定的消息發(fā)送到一個或多個窗口。此函數(shù)為指定的窗口調(diào)用窗口程序,直到窗口程序處理完消息再返回。需要注意的是,SendMessage發(fā)送的這條消息不會被放進目標應用程序隊列中。函數(shù)的返回值是由接收消息的窗口的窗口函數(shù)返回,返回的值取決于被發(fā)送的消息。PostMessage:函數(shù)原型:LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam);參數(shù)解釋同上。函數(shù)功能:該函數(shù)將一個消息放入(寄送)到與指定窗口創(chuàng)建的線程相聯(lián)系消息隊列里,不等待線程處理消息就返回,是異步消息模式。該函數(shù)把一條消息放置到創(chuàng)建hWnd窗口的線程的消息隊列中,該函數(shù)不等消息被處理就馬上將控制返回。從上面這兩個函數(shù),我們可以看出消息的發(fā)送方式和寄送方式的區(qū)別:被發(fā)送的消息會被立即處理,處理完畢后函數(shù)才返回;被寄送的消息不會被立即處理,他被放到一個先進先出的隊列中,按次序等候處理,而且函數(shù)放置消息后立即返回。以寄送方式發(fā)送的消息通常是與用戶輸入事件相對應的,因為這些事件不是十分緊迫,可以進行緩沖處理,例如鼠標、鍵盤消息都是寄送消息。應用程序調(diào)用系統(tǒng)函數(shù),系統(tǒng)一般會通過發(fā)送方式發(fā)送非隊列消息。例如,當程序調(diào)用SetWindowPos,系統(tǒng)會發(fā)送WM_WINDOWPOSCHANGED消息。

通過圖示解釋如下:系統(tǒng)消息隊列通過圖示解釋如下:系統(tǒng)消息隊列四、消息循環(huán)我們通過上述的介紹,大概了解了消息以及消息的發(fā)送方式。我們現(xiàn)在介紹在隊列消息中的消息循環(huán)問題。有上述的介紹得知,在WindowsSystem收集消息后,將其存入到系統(tǒng)消息隊列,而系統(tǒng)消息隊列再通過PostMessage將消息分配給應用程序的消息隊列。當消息進入應用程序的消息隊列后,應用程序通過消息循環(huán)的方法從應用程序的消息隊列中讀取消息。當應用程序消息隊列中存在消息時,通過消息循環(huán),如下:while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}當一個窗口被初始化,建立后,程序便進入消息循環(huán),若應用程序的消息隊列中有消息,那么消息循環(huán)取得MSG的結(jié)構(gòu)。消息循環(huán)是如何取得MSG結(jié)構(gòu)的呢,GetMessage是如何工作的?GetMessage函數(shù)原型:BOOLGetMessage(LPMSGlpMsg,HWNDhWnd,UINTwMsgFilterMin,UINTwMsgFilterMax);參數(shù):lpMsg:—個指向MSG結(jié)構(gòu)的指針,該結(jié)構(gòu)用于存放從消息隊列里取出的消息,獲得MSG結(jié)構(gòu)。hWnd:窗口句柄。如果該參數(shù)是非零值,則GetMessage只檢索該窗口(也包括其子窗口)消息,如果為零,則GetMessage檢索整個進程內(nèi)的消息。wMsgFilterMin:指定被檢索的最小消息值,也就是消息范圍的下界限參數(shù)。wMsgFilterMax:上界限參數(shù)。如果wMsgFilterMin和wMsgFilterMax都為零,則不進行消息過濾,GetMessage檢索所有有效的消息。返回值GetMessage檢索到WM_QUIT消息,返回值是零;其它情況,返回非零值。在消息循環(huán)的循環(huán)體中,函數(shù)TranslateMessage(&msg)的功能是變換消息,使它規(guī)范化以便于處理,DispatchMessage(&msg)的功能是根據(jù)MSG提供的信息,提請操作系統(tǒng)幫助,把消息由操作系統(tǒng)送到相應應用程序的窗口函數(shù)并由操作系統(tǒng)調(diào)用相應的窗口函數(shù)。所以必須注意的是,不是由應用程序直接調(diào)用窗口函數(shù),而是由應用程序的消息循環(huán)函數(shù)DispatchMessage(&msg)提請操作系統(tǒng)的幫助調(diào)用窗口函數(shù)的。當然,窗口函數(shù)執(zhí)行完后,返回的不是應用程序,而是操作系統(tǒng)(因為調(diào)用它的是操作系統(tǒng))。額外我們再說一下關(guān)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論