



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、隊列消息和非隊列消息從消息的發(fā)送途徑來看,消息可以分成2種:隊列消息和非隊列消息。消息隊列由可 以分成系統(tǒng)消息隊列和線程消息隊列。系統(tǒng)消息隊列由Windows維護(hù),線程消息隊列則由 每個GUI線程自己進(jìn)行維護(hù),為避免給non-GUI現(xiàn)成創(chuàng)建消息隊列,所有線程產(chǎn)生時并沒 有消息隊列,僅當(dāng)線程第一次調(diào)用GDI函數(shù)數(shù)系統(tǒng)給線程創(chuàng)建一個消息隊列。隊列消息送 到系統(tǒng)消息隊列,然后到線程消息隊列:非隊列消息直接送給目的窗口過程。對于隊列消息,最常見的是鼠標(biāo)和鍵盤觸發(fā)的消息,例如W_M0USERM0VE, WM_CHAR等 消息,還有一些其它的消息,例如:WM_PANT、WM_TIMER和WM_QUIT。當(dāng)
2、鼠標(biāo)、鍵盤事件 被觸發(fā)后,相應(yīng)的鼠標(biāo)或鍵盤驅(qū)動程序就會把這些事件轉(zhuǎn)換成相應(yīng)的消息,然后輸送到系 統(tǒng)消息隊列,由Windows系統(tǒng)去進(jìn)行處理。Windows系統(tǒng)則在適當(dāng)?shù)臅r機(jī),從系統(tǒng)消息隊 列中取出一個消息,根據(jù)前面我們所說的USG消息結(jié)構(gòu)確定消息是要被送往那個窗口,然 后把取出的消息送往創(chuàng)建窗口的線程的相應(yīng)隊列,下面的事情就該由線程消息隊列操心了, Windows開始忙自己的事情去了。線程看到自己的消息隊列中有消息,就從隊列中取出來, 通過操作系統(tǒng)發(fā)送到合適的窗口過程去處理。一般來講,系統(tǒng)總是將消息Post在消息隊列的末尾。這樣保證窗口以先進(jìn)先出的順序接受消息。然而,WNLPAINT是一個例外
3、, 同一個窗口的多個WM_PAINT被合并成一個WM_PAINT消息,合并所有的無效區(qū)域到一個 無效區(qū)域。合并W_PAIN的目的是為了減少刷新窗口的次數(shù)。非隊列消息將會繞過系統(tǒng)隊列和消息隊列,直接將消息發(fā)送到窗口過程,。系統(tǒng)發(fā)送 非隊列消息通知窗口,系統(tǒng)發(fā)送消息通知窗口。例如,當(dāng)用戶激活一個窗口系統(tǒng)發(fā)送 .ACTIVATE, WM_SETFOCUS, and W.SETCURSOR,這些消息通知窗口它被激活了。非隊列 消息也可以由當(dāng)應(yīng)用程序調(diào)用系統(tǒng)函數(shù)產(chǎn)生。例如,當(dāng)程序調(diào)用SetWindowPos系統(tǒng)發(fā)送WM_WINDOWPOSCHANGED消息。一些函數(shù)也發(fā)送非隊列消息,例 如下面我們要談到
4、的函數(shù)。消息的發(fā)送了解了上面的這些基礎(chǔ)理論之后,我們就可以進(jìn)行一下簡單的消息發(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ā)送一條消息、,一直等到消 息被處理之后才會返回。不過需要注意的是,如果接收消息的窗口是同一個應(yīng)用程序的一 部分,那么這個窗口的窗口函數(shù)就被作為一個子程序馬上被調(diào)用;如果接收消息的窗口是被另外的線程所創(chuàng)建的,那么窗口系統(tǒng)就切換到相應(yīng)的線程并旦調(diào)用相應(yīng)的窗口函數(shù),這 條消息不會被放進(jìn)目標(biāo)應(yīng)用程序隊列中。函數(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ù)設(shè)置 成當(dāng)前線程的標(biāo)志來調(diào)用PostThreadMEssage函數(shù)。從上面的這2個具有代表性的函數(shù),我們可以看出消息的發(fā)送方式和寄送方式的區(qū)別 所在:被發(fā)送的消息是否會被立即處理,
7、函數(shù)是否立即返回。被發(fā)送的消息會被立即處理, 處理完畢后函數(shù)才會返回;被寄送的消息不會被立即處理,他被放到一個先進(jìn)先出的隊列 中,一直等到應(yīng)用程序空線的時候才會被處理,不過函數(shù)放置消息后立即返回。實際上,發(fā)送消息到一個窗口處理過程和直接調(diào)用窗口處理過程之間并沒有太大的區(qū)別,他們 直接的唯一區(qū)別就在于你可以要求操作系統(tǒng)截獲所有被發(fā)送的消息,但是不能夠截獲對窗 口處理過程的直接調(diào)用。以寄送方式發(fā)送的消息通常是與用戶輸入事件相對應(yīng)的,因為這些事件不是十分緊迫,可以進(jìn)行緩慢的緩沖處理,例如赳標(biāo)、健盤消息會被寄送,而 按鈕等消息則會被發(fā)送。廣播消息用得比較少,BroadcastSystemMessage
8、函數(shù)原型如下:long BroadcastSystemMessage(DWORD dwFlags, LPDWORD IpdwRecipients, UINT uiMessage, WPARAM wParam, LPARAM IParam);該函數(shù)可以向指定的接收者發(fā)送一條消息, 這些接收者可以是應(yīng)用程序、可安裝的驅(qū)動程序、網(wǎng)絡(luò)驅(qū)動程序、系統(tǒng)級別的設(shè)備驅(qū)動消 息和他們的任意組合。需要注意的是,如果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ù)所指定的窗口相關(guān)的且wMsgFilterMin和wMsgFilterMax參數(shù)所給出的消息值范圍內(nèi)的消息。需要注意的是, 如果hWnd為NULL,則GetMessage獲取屬于調(diào)用該函數(shù)應(yīng)用程序的任一窗口的消息,如果 wMsgFilterMin 和wMsgFilte
10、rMax都是0,則GetMessage就返回所有可得到的消息。函數(shù)獲取之后將刪 除消息隊列中的除WM-PAINT消息之外的其他消息,至于WM_PAINT則只有在其處理之后才 被刪除。PeekMessage 原型如下:BOOL PeekMessage (LPMSG IpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINTwRemoveMsg);該函數(shù)用于查看應(yīng)用程序的消息隊列,如果其中有消息就將其放入IpMsg所指的結(jié)構(gòu) 中,不過,與GetMessage不同的是,PeekMessage函數(shù)不會等到有消息放入隊列時才返回。 同樣,
11、如果hWnd為NULL,則PeekMessage獲取屬于調(diào)用該函數(shù)應(yīng)用程序的任一窗口的消 息,如果hWnd=-l,那么函數(shù)只返回把hWnd參數(shù)為NULL的PostAppMessage函數(shù)送去的消 息。如果 wMsgFilterMin 和wMsgFilterMax都是0 ,則PeekMessage就返回所有可得到的消息。函數(shù)獲取之后將 刪除消息隊列中的除WM_PAINT消息之外的其他消息,至于WNLPAINT則只有在其處理之后 才被刪除。WaitMessage原型如下:BOOL VaitMessage ();當(dāng)一個應(yīng)用程序無事可做時,該函數(shù)就 將控制權(quán)交給另外的應(yīng)用程序,同時將該應(yīng)用程序掛起,直到一個新的消息被放入應(yīng)用程 序的隊列之中才返回。消息的處理接下來我們談一下消息的處理,首先我們來
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年投資理財師職業(yè)資格考試試題及答案
- 2025年全國碩士研究生考試題及答案
- 2025年綠色建筑設(shè)計專業(yè)考研試卷及答案
- 2025年科技創(chuàng)新與管理實踐能力考試試題及答案
- 2025年計算機(jī)網(wǎng)絡(luò)技術(shù)職業(yè)資格考試卷及答案
- 北師大版(2024)七年級下冊英語期末復(fù)習(xí):各單元主題作文范文
- 2025年電子商務(wù)專才職業(yè)資格考試試題及答案
- 員工生日會流程策劃與實施
- 痔病人的外科護(hù)理
- 車間內(nèi)龍門吊車安全培訓(xùn)
- 畜牧業(yè)對農(nóng)業(yè)農(nóng)村發(fā)展的引領(lǐng)作用
- 離婚協(xié)議書(完整版)WORDx(二篇)
- 《液晶顯示基礎(chǔ)教材》課件
- 物業(yè)客服課件培訓(xùn)模板
- 床上洗頭醫(yī)院基礎(chǔ)護(hù)理知識要點
- 中等專業(yè)學(xué)校畢業(yè)生登記表-3
- 個人勞務(wù)清包工簡單合同
- 林木管護(hù)服務(wù)投標(biāo)方案技術(shù)標(biāo)
- 華為流程與信息化實踐與架構(gòu)規(guī)劃分享課件
- 房屋拆除施工合同
- 國家開放大學(xué)《知識產(chǎn)權(quán)法》考試復(fù)習(xí)題庫(含答案)
評論
0/150
提交評論