隊列消息和非隊列消息_第1頁
隊列消息和非隊列消息_第2頁
隊列消息和非隊列消息_第3頁
隊列消息和非隊列消息_第4頁
全文預覽已結束

下載本文檔

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

文檔簡介

1、隊列消息和非隊列消息從消息的發(fā)送途徑來看,消息可以分成2種:隊列消息和非隊列消息。消息隊列由可 以分成系統(tǒng)消息隊列和線程消息隊列。系統(tǒng)消息隊列由Windows維護,線程消息隊列則由 每個GUI線程自己進行維護,為避免給non-GUI現(xiàn)成創(chuàng)建消息隊列,所有線程產(chǎn)生時并沒 有消息隊列,僅當線程第一次調用GDI函數(shù)數(shù)系統(tǒng)給線程創(chuàng)建一個消息隊列。隊列消息送 到系統(tǒng)消息隊列,然后到線程消息隊列:非隊列消息直接送給目的窗口過程。對于隊列消息,最常見的是鼠標和鍵盤觸發(fā)的消息,例如W_M0USERM0VE, WM_CHAR等 消息,還有一些其它的消息,例如:WM_PANT、WM_TIMER和WM_QUIT。當

2、鼠標、鍵盤事件 被觸發(fā)后,相應的鼠標或鍵盤驅動程序就會把這些事件轉換成相應的消息,然后輸送到系 統(tǒng)消息隊列,由Windows系統(tǒng)去進行處理。Windows系統(tǒng)則在適當?shù)臅r機,從系統(tǒng)消息隊 列中取出一個消息,根據(jù)前面我們所說的USG消息結構確定消息是要被送往那個窗口,然 后把取出的消息送往創(chuàng)建窗口的線程的相應隊列,下面的事情就該由線程消息隊列操心了, Windows開始忙自己的事情去了。線程看到自己的消息隊列中有消息,就從隊列中取出來, 通過操作系統(tǒng)發(fā)送到合適的窗口過程去處理。一般來講,系統(tǒng)總是將消息Post在消息隊列的末尾。這樣保證窗口以先進先出的順序接受消息。然而,WNLPAINT是一個例外

3、, 同一個窗口的多個WM_PAINT被合并成一個WM_PAINT消息,合并所有的無效區(qū)域到一個 無效區(qū)域。合并W_PAIN的目的是為了減少刷新窗口的次數(shù)。非隊列消息將會繞過系統(tǒng)隊列和消息隊列,直接將消息發(fā)送到窗口過程,。系統(tǒng)發(fā)送 非隊列消息通知窗口,系統(tǒng)發(fā)送消息通知窗口。例如,當用戶激活一個窗口系統(tǒng)發(fā)送 .ACTIVATE, WM_SETFOCUS, and W.SETCURSOR,這些消息通知窗口它被激活了。非隊列 消息也可以由當應用程序調用系統(tǒng)函數(shù)產(chǎn)生。例如,當程序調用SetWindowPos系統(tǒng)發(fā)送WM_WINDOWPOSCHANGED消息。一些函數(shù)也發(fā)送非隊列消息,例 如下面我們要談到

4、的函數(shù)。消息的發(fā)送了解了上面的這些基礎理論之后,我們就可以進行一下簡單的消息發(fā)送與接收。把一個消息發(fā)送到窗口有3種方式:發(fā)送、寄送和廣播。發(fā)送消息的函數(shù)有SendMessage SendMessageCallback' SendNotifyMessage SendMessageTimeout:寄送 消息的函數(shù)主要有 PostUessage、PostThreadMessage、PostQuitMessage:廣播消息的函 數(shù)我知道的只有 BroadcastSystemMessagex BroadcastSystemMessageEx0SendMessage 的原型如下:LRESULT S

5、endMessage (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM IParam),這個函數(shù)主要是向一個或多個窗口發(fā)送一條消息、,一直等到消 息被處理之后才會返回。不過需要注意的是,如果接收消息的窗口是同一個應用程序的一 部分,那么這個窗口的窗口函數(shù)就被作為一個子程序馬上被調用;如果接收消息的窗口是被另外的線程所創(chuàng)建的,那么窗口系統(tǒng)就切換到相應的線程并旦調用相應的窗口函數(shù),這 條消息不會被放進目標應用程序隊列中。函數(shù)的返回值是由接收消息的窗口的窗口函數(shù)返回,返回的值取決于被發(fā)送的消 息。PostMessage 的原型如下:BOOL P。stress a

6、ge (HWXD hWnd, UINT Msg, WPARAM wParam, LPARAM IParam),該函數(shù)把一條消息放置到創(chuàng)建hWnd窗口的線程的消息隊列中, 該函數(shù)不等消息被處理就馬上將控制返回。需要注意的是,如果hWnd參數(shù)為HWND.BROADCAST,那么,消息將被寄送給系統(tǒng)中的所有的重疊窗口和彈出窗口,但是 子窗口不會收到該消息;如果hWnd參數(shù)為NULL,則該函數(shù)類似于將dwThreadID參數(shù)設置 成當前線程的標志來調用PostThreadMEssage函數(shù)。從上面的這2個具有代表性的函數(shù),我們可以看出消息的發(fā)送方式和寄送方式的區(qū)別 所在:被發(fā)送的消息是否會被立即處理,

7、函數(shù)是否立即返回。被發(fā)送的消息會被立即處理, 處理完畢后函數(shù)才會返回;被寄送的消息不會被立即處理,他被放到一個先進先出的隊列 中,一直等到應用程序空線的時候才會被處理,不過函數(shù)放置消息后立即返回。實際上,發(fā)送消息到一個窗口處理過程和直接調用窗口處理過程之間并沒有太大的區(qū)別,他們 直接的唯一區(qū)別就在于你可以要求操作系統(tǒng)截獲所有被發(fā)送的消息,但是不能夠截獲對窗 口處理過程的直接調用。以寄送方式發(fā)送的消息通常是與用戶輸入事件相對應的,因為這些事件不是十分緊迫,可以進行緩慢的緩沖處理,例如赳標、健盤消息會被寄送,而 按鈕等消息則會被發(fā)送。廣播消息用得比較少,BroadcastSystemMessage

8、函數(shù)原型如下:long BroadcastSystemMessage(DWORD dwFlags, LPDWORD IpdwRecipients, UINT uiMessage, WPARAM wParam, LPARAM IParam);該函數(shù)可以向指定的接收者發(fā)送一條消息, 這些接收者可以是應用程序、可安裝的驅動程序、網(wǎng)絡驅動程序、系統(tǒng)級別的設備驅動消 息和他們的任意組合。需要注意的是,如果dwFlags參數(shù)是BSF_QUERY并且至少一個接收 者返回了BROADCAST_QUERY_DENY,則返回值為0 ,如果沒有指定BSF_QUERY,則函數(shù)將消息發(fā) 送給所有接收者,并且忽略其返回值

9、。消息的接收消息的接收主要有 3 個函數(shù):GetMessage、PeekMessage、WaitMessageoGetMessage 原型如下:BOOL GetMessage (LPMSG IpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);該函數(shù)用來獲取與hWnd參數(shù)所指定的窗口相關的且wMsgFilterMin和wMsgFilterMax參數(shù)所給出的消息值范圍內(nèi)的消息。需要注意的是, 如果hWnd為NULL,則GetMessage獲取屬于調用該函數(shù)應用程序的任一窗口的消息,如果 wMsgFilterMin 和wMsgFilte

10、rMax都是0,則GetMessage就返回所有可得到的消息。函數(shù)獲取之后將刪 除消息隊列中的除WM-PAINT消息之外的其他消息,至于WM_PAINT則只有在其處理之后才 被刪除。PeekMessage 原型如下:BOOL PeekMessage (LPMSG IpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINTwRemoveMsg);該函數(shù)用于查看應用程序的消息隊列,如果其中有消息就將其放入IpMsg所指的結構 中,不過,與GetMessage不同的是,PeekMessage函數(shù)不會等到有消息放入隊列時才返回。 同樣,

11、如果hWnd為NULL,則PeekMessage獲取屬于調用該函數(shù)應用程序的任一窗口的消 息,如果hWnd=-l,那么函數(shù)只返回把hWnd參數(shù)為NULL的PostAppMessage函數(shù)送去的消 息。如果 wMsgFilterMin 和wMsgFilterMax都是0 ,則PeekMessage就返回所有可得到的消息。函數(shù)獲取之后將 刪除消息隊列中的除WM_PAINT消息之外的其他消息,至于WNLPAINT則只有在其處理之后 才被刪除。WaitMessage原型如下:BOOL VaitMessage ();當一個應用程序無事可做時,該函數(shù)就 將控制權交給另外的應用程序,同時將該應用程序掛起,直到一個新的消息被放入應用程 序的隊列之中才返回。消息的處理接下來我們談一下消息的處理,首先我們來

溫馨提示

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

評論

0/150

提交評論