青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

深入GetMessage和PeekMessage

from:http://blog.csdn.net/fireseed/archive/2002/09/10/2176.aspx

深入GetMessagePeekMessage

 

Bob Gunderson

MSDN技術(shù)組

作于:19921111

 

Creamdog

譯于:2002313

 

譯者的話

該文重點(diǎn)講述了Windows處理事件、消息的具體過程和步驟。尤其是在系系處理鼠標(biāo)鍵盤事件的過程上做了詳解。通過這篇文章,你將對Windows的消息處理機(jī)制有一個(gè)較全面的了解。

概念

 

這篇文章解釋了GetMessagePeekMessage的內(nèi)部運(yùn)作方式,同時(shí)也是一類與“消息及消息在16 MS-DOS?/Microsoft? Windows?環(huán)境之下的影響”相關(guān)文章的基礎(chǔ)。我們將討論下面這些主題:

·系統(tǒng)和應(yīng)用程序隊(duì)列(譯者注:以下簡稱為“程序隊(duì)列”)

·GetMessagePeekMessage函數(shù)

·消息過濾

·WM_QUIT消息

·讓步和休眠

·讓步的問題

·WaitMessage

 

16MS-DOS/Windows環(huán)境和32Win32?/Windows NT?環(huán)境有些很重要的不同之處。雖然這些不同之處在這兒無法被忽視,但我們還是把它們做為遺留問題,由以后的文章去解釋吧。

 

隊(duì)列

要理解GetMessagePeekMessage的運(yùn)作,必須首先明白Microsoft? Windows?操作系統(tǒng)是如何儲存事件和消息的。在Windows中有兩種類型的隊(duì)列為此目的工作,它們分別是系統(tǒng)隊(duì)列和消息隊(duì)列。

 

硬件輸入:系統(tǒng)隊(duì)列

Windows有一些驅(qū)動程序,它們負(fù)責(zé)響應(yīng)來自于鍵盤和鼠標(biāo)等硬件的中斷服務(wù)。在中斷時(shí)間中,鍵盤和鼠標(biāo)驅(qū)動程序會調(diào)用USER.EXE中指定的一些入口點(diǎn)去報(bào)告一個(gè)事件的發(fā)生。在Windows中服務(wù)于光筆計(jì)算的光筆驅(qū)動程序,同樣會在原始的光筆事件中調(diào)用這些入口點(diǎn)。

  

Windows3.1中,系統(tǒng)隊(duì)列是一個(gè)有著120個(gè)入口空間的定長的隊(duì)列。在一般情形下這些“小房間”是足夠了,但如果應(yīng)用程序掛起了或者在一段長的時(shí)間里沒有及時(shí)處理任何消息就可能導(dǎo)致系統(tǒng)隊(duì)列被填滿。如果真的發(fā)生了,任何嘗試添加到系統(tǒng)隊(duì)列的新事件都將會引起系統(tǒng)蜂鳴。(譯者注:在DOS中,如果一個(gè)程序在一段時(shí)間內(nèi)占用了所有的系統(tǒng)資源,使機(jī)器無法響應(yīng),這時(shí)如果你按住一個(gè)鍵不放,你就會聽到機(jī)箱喇叭嘀嘀作響)

 

發(fā)送的消息和程序隊(duì)列

當(dāng)一個(gè)應(yīng)用程序開始時(shí),一個(gè)隊(duì)列將會因此而被創(chuàng)建。程序隊(duì)列(有時(shí)會稱為任務(wù)隊(duì)列)常常用于儲存“正在被發(fā)往應(yīng)用程序的一個(gè)窗口” 的消息。唯一常駐程序隊(duì)列的消息是那些由PostMessagePostAppMessage明確發(fā)送的消息。(SendMessage從不使用系統(tǒng)隊(duì)列)PostQuitMessage函數(shù)不會發(fā)送一個(gè)消息到程序隊(duì)列。(WM_QUIT消息將在下文中論討)

默認(rèn)的,每個(gè)程序隊(duì)列可以保持八個(gè)消息。一般情況下這是相當(dāng)足夠的,因?yàn)?/span>PostMessage極少被使用。但是如果一個(gè)應(yīng)用程序試圖強(qiáng)制調(diào)用很多的PostMessage到某個(gè)應(yīng)用程序時(shí),那么這類應(yīng)用程序?qū)檬褂?/span>SetMessageQueue函數(shù)來增加消息隊(duì)列的長度。你必須小心的使用SetMessageQueue函數(shù),因?yàn)樗鼰o論何時(shí)都會先刪掉當(dāng)前的程序隊(duì)列,并創(chuàng)建一個(gè)預(yù)期大小的新隊(duì)列,此時(shí)任何在舊隊(duì)列中的消息都會被銷毀。因此,它必須在你的WinMain例程中在所有其它的應(yīng)用程序編程接口(API)之前調(diào)用或在應(yīng)用程序用PeekMessage明確的清除隊(duì)列之后調(diào)用。

 

GetMessagePeekMessage是怎樣工作的

Windows的內(nèi)部,GetMessagePeekMessage執(zhí)行著相同的代碼。而兩者最大的不同之處則體現(xiàn)在沒有任何消息返回到應(yīng)用程序的情況下。在此種情況下,PeekMessage會返回一個(gè)空值到應(yīng)用程序,GetMessage會在此時(shí)讓應(yīng)用程序休眠。在它們之間還有一些其它的不同,我們將會在下面討論,但它們相當(dāng)次要。

 

GetMessagePeekMessage邏輯

下面一步步的講述了在Windows3.1版的GetMessagePeekMessage公用代碼。

提示:下面所示步驟按照消息類型的優(yōu)先權(quán)進(jìn)行排序。舉個(gè)例子,發(fā)送的消息總在鍵盤和鼠標(biāo)消息之前被返回,而鍵盤和鼠標(biāo)的消息又會在繪圖(paint)消息之前反回,以此類推。

1.         檢視在為“活動中任務(wù)”服務(wù)的程序隊(duì)列中是否有消息的存在。如果是,首先在隊(duì)首刪除此消息并將其返回到應(yīng)用程序。然后,應(yīng)用程序中的GetMessagePeekMessage會調(diào)用一些代碼,用以從程序隊(duì)列中接收此消息,這些代碼是由該應(yīng)用程序調(diào)用的動態(tài)鏈接庫(DLL)生成的。記住,只有由PostMessage發(fā)送的消息會常駐于此隊(duì)列中。

2.         與所有消息和窗體句柄過濾器進(jìn)行對照,核查此消息。如果此消息不匹配指定的過濾器,就會把此消息留在程序隊(duì)列中。如果隊(duì)列中在此消息的后面還有其它消息,則會轉(zhuǎn)向?qū)ο乱粋€(gè)消息的處理。

3.         如果在程序隊(duì)列中沒有消息了,就掃描系統(tǒng)隊(duì)列中的事件。這個(gè)過程相當(dāng)復(fù)雜,并且我們將在下面的“掃描系統(tǒng)隊(duì)列”小節(jié)中XX。一般來講,在系統(tǒng)隊(duì)列首部的事件是供這個(gè)應(yīng)用程序所使用的,系統(tǒng)會將其轉(zhuǎn)化為消息,并將消息返回到這個(gè)應(yīng)用程序中(它不會首先被置于應(yīng)用隊(duì)列中)。注意,這個(gè)掃描系統(tǒng)隊(duì)列的過程可能導(dǎo)致當(dāng)前活動的應(yīng)用程序?qū)⒖刂茩?quán)讓給其它的應(yīng)用程序。

4.         如果在系統(tǒng)隊(duì)列中沒有等待處理的事件,則核查所有與當(dāng)前應(yīng)用程序(任務(wù))相關(guān)的窗體以確定更新區(qū)域。當(dāng)一個(gè)窗體的一部分需要被重繪時(shí),一個(gè)更新區(qū)域就被創(chuàng)建在那個(gè)窗體部分之上。這個(gè)區(qū)域?qū)⑴c此窗體中現(xiàn)存的所有更新區(qū)域相結(jié)合,并儲存在內(nèi)部窗體結(jié)構(gòu)體中。如果GetMessagePeekMessage在這個(gè)任務(wù)中發(fā)現(xiàn)某些窗體有一些未處理的更新區(qū)域,將產(chǎn)生一個(gè)WM_PAINT消息,并為那個(gè)窗體返回到應(yīng)用程序中。WM_PAINT從不駐留在任何隊(duì)列中。此時(shí),一個(gè)應(yīng)用程序?qū)槟硞€(gè)窗體不斷的接收WM_PATIN消息,直到更新區(qū)域由BeginPaint/EndPaintValidateRect,或ValidateRgn所清除。

5.         如果這個(gè)任務(wù)中沒有任何窗體需要被更新,GetMessagePeekMessage就會在這一點(diǎn)讓出控制權(quán),除非PeekMessage調(diào)用被設(shè)置為PM_NOYIELD屬性。

6.         當(dāng)讓步返回時(shí),檢視在當(dāng)前任務(wù)中是否有計(jì)時(shí)器到期。如果是,創(chuàng)建一個(gè)WM_TIMER消息并返回。它不但發(fā)生在“返回一個(gè)WM_TIMER消息到窗體”的計(jì)時(shí)器上,同樣也發(fā)生在“調(diào)用一個(gè)計(jì)時(shí)器處理過程”的計(jì)時(shí)器上。如要了解更多信息,請看在微軟開發(fā)者網(wǎng)絡(luò)(MSDN)光盤(包括技術(shù)文章、Windows文章、核心和驅(qū)動程序文章)中的文章“Timers and Timing in Microsoft Windows”(譯者注:如果讀者能夠認(rèn)可我的工作,我會不遺余力地翻譯這篇關(guān)于計(jì)時(shí)器的文章)。

7.         如果這個(gè)應(yīng)用程序沒有計(jì)時(shí)器事件服務(wù),并且一個(gè)應(yīng)用程序正在被終止,代碼將嘗試去縮小圖形設(shè)備界面(GDI)的本地內(nèi)存堆。一些應(yīng)用程序,比如繪圖應(yīng)用程序(像Paintbrush?),為GDI分配了大量的堆內(nèi)存。當(dāng)應(yīng)用程序終止時(shí)釋放這些對象時(shí),會使GDI本地內(nèi)存堆被空閑空間填滿而膨脹。為了恢復(fù)這些空閑的空間, GetMessage/PeekMessage處理中,LocalShrink將在這一點(diǎn)被調(diào)用于GDI的內(nèi)存堆。這個(gè)被完成一次,(每次)一個(gè)應(yīng)用程序?qū)⒔K止。

8.         在這一時(shí)刻,代碼將分叉為兩條路,一是代碼任意的返回一個(gè)有效的消息,另一個(gè)是完全沒有這個(gè)應(yīng)用程序去處理的消息、事件,而代碼最終會走哪條路決定于PeekMessageGetMessage中的哪一個(gè)被調(diào)用。

·PeekMessage. 如果PeekMessage被調(diào)用,并設(shè)置了PM_NOYIELD標(biāo)記,PeekMessage在此刻返回一個(gè)空值,這個(gè)空返回值指出已經(jīng)沒有要處理的消息了。如果沒有設(shè)置PM_NOYIELD標(biāo)記,PeekMessage就在此刻讓出控制權(quán)。它不會休眠,但會單一的交給其它已準(zhǔn)備好的應(yīng)用程序一個(gè)執(zhí)行的機(jī)會。(請參閱下面的“讓步與休眠的不同)當(dāng)讓步返回,PeekMessage直接將控制權(quán)返回到應(yīng)用程序,并返回一個(gè)空值,它指出這個(gè)應(yīng)用程序沒有要處理的消息了。

?GetMessage. 在此刻,GetMessage會讓應(yīng)用程序休眠、等待,直到一些事件發(fā)生需要喚醒應(yīng)用程序。控制權(quán)不會返回到調(diào)用GetMessage的應(yīng)用程序,直到有應(yīng)用程序必須去處理的消息出現(xiàn)。一旦這個(gè)應(yīng)用程序從被置入休眠狀態(tài)中醍來,GetMessage內(nèi)部的循環(huán)將回到最開始(步驟1)。

 

WH_GETMESSAGE鉤子

GetMessagePeekMessage將一個(gè)消息返回到調(diào)用的應(yīng)用程序之前,會做一個(gè)驗(yàn)證是否存在一個(gè)WH_GETMESSAGE鉤子的測試。如果有一個(gè)已經(jīng)被安裝了,那這個(gè)鉤子會被調(diào)用。如果PeekMessage沒有發(fā)現(xiàn)可用的消息并返回一個(gè)空值時(shí),這個(gè)鉤子將不會被調(diào)用。在鉤子處理過程中,你不可能得知是到底是GetMessage被調(diào)用還是PeekMessage被調(diào)用。

 

掃描系統(tǒng)隊(duì)列

綜上所述,在系統(tǒng)隊(duì)列中的事件僅僅是硬件事件的記錄。那些代碼掃描系統(tǒng)隊(duì)列的主要任務(wù)是,從這些事件中創(chuàng)建消息,并確定哪一個(gè)窗體將接收這個(gè)消息。

代碼第一次在系統(tǒng)隊(duì)列首部找到事件時(shí),并不會馬上將其刪除。因?yàn)槭髽?biāo)和鍵盤事件只是隊(duì)列中的兩種事件,而代碼會分枝(譯者注:類似于C語言中的switch語句)并單獨(dú)處理每一種類型的事件。

 

處理系統(tǒng)隊(duì)列中的鼠標(biāo)事件

下面是處理鼠標(biāo)事件的步驟。

1.  首先,將計(jì)算該事件屏幕坐標(biāo)的相應(yīng)窗體。此計(jì)算(調(diào)用窗體點(diǎn)擊測試)以桌面窗體開始,從頭至尾的掃描細(xì)統(tǒng)中的每一個(gè)窗體(包括子窗體),直到找到一個(gè)包含這個(gè)鼠標(biāo)坐標(biāo)點(diǎn)的窗體,并且這個(gè)窗體沒有任何同樣包含這個(gè)坐標(biāo)點(diǎn)的子窗體。

2. 鼠標(biāo)事件的窗體點(diǎn)擊測試

例如:如果圖2中的箭頭代表當(dāng)前的鼠標(biāo)位置,任何的鼠標(biāo)行為,像單擊鼠標(biāo)鍵,將生成一個(gè)會在B窗體中產(chǎn)生消息的事件。

2.  如果一個(gè)窗體使用SetCapture捕獲鼠標(biāo),那么“系統(tǒng)隊(duì)列掃描”代碼將通過普通的點(diǎn)擊測試,并將所有的鼠標(biāo)消息返回到捕獲的窗體。例如:如果在圖2 中的A窗體調(diào)用了SetCapture,則在箭頭所指位置的所有鼠標(biāo)行為,將產(chǎn)生窗體A中的消息,而不是窗體B

3.  如果這個(gè)被處理的事件是一個(gè)“鼠標(biāo)鍵按下”事件(任何一個(gè)鼠標(biāo)鍵),代碼會檢測這個(gè)事件是否會轉(zhuǎn)化為雙擊事件。你可以在微軟開發(fā)者網(wǎng)絡(luò)(譯者注:MSDNCD(技術(shù)文章,Ask Dr. GUI)中的“Ask Dr. GUI #5”中找到關(guān)于雙擊轉(zhuǎn)化的描述。實(shí)質(zhì)上,如果在兩次鼠標(biāo)鍵按下事件中,時(shí)間和距離的增量在允許的范圍之中,該事件將會生成一個(gè)雙擊消息,否則它將生成一個(gè)標(biāo)準(zhǔn)的“按下”事件。所有的鼠標(biāo)事件都將生成標(biāo)準(zhǔn)的鼠標(biāo)消息,而雙擊測試只在鼠標(biāo)事件指定的,包含CS_DBLCLKS類型的窗體中進(jìn)行。

4.  一個(gè)消息從鼠標(biāo)事件中構(gòu)造出來。

5.  如果鼠標(biāo)點(diǎn)擊測試確定該事件發(fā)生在一個(gè)窗體的非客戶區(qū),如邊框或標(biāo)題欄,那么該構(gòu)造出的消息映射到它相應(yīng)的非客戶區(qū)消息中。例如:一個(gè)WM_MOUSEMOVE事件會被映謝為WM_NCMOUSEMOVE消息。

6.  與所有指定的消息過濾器進(jìn)行對照,核查此消息。(請參閱下面的“消息范圍過濾和窗體句柄過濾”)如果該消息不匹配過濾器,則重新從頭開始“系統(tǒng)隊(duì)列掃描”代碼,查看隊(duì)列中的下一個(gè)消息。

7.  如果鼠標(biāo)消息需要前往與當(dāng)前任務(wù)不同的另一個(gè)任務(wù)的相關(guān)窗體,事件會被留在系統(tǒng)隊(duì)列中,并且如果那個(gè)將會處理這個(gè)消息的任務(wù)在休眠之中,會被喚醒。這個(gè)新近被喚醒的任務(wù)不會在此刻立即運(yùn)行,只會標(biāo)記為準(zhǔn)備運(yùn)行。如果消息前往了其它任務(wù),并且在系統(tǒng)隊(duì)列中沒有要處理的事件被發(fā)現(xiàn),“系統(tǒng)隊(duì)列掃描”會代碼返回到GetMessage/PeekMessage主代碼。請參閱下面的“讓步與休眠的不同”以獲得更多的信息。

8.  如果安裝了鼠標(biāo)鉤子,它將在此刻被調(diào)用。如果鼠標(biāo)鉤子返回了一個(gè)非零值,那么該鼠標(biāo)事件被忽略,并從系統(tǒng)隊(duì)列中被刪除,然后重新從頭開始“系統(tǒng)隊(duì)列掃描”代碼。如果鉤子返回零,則繼續(xù)處理。

9.  如果消息是一個(gè)“鼠標(biāo)鍵按下”消息,“系統(tǒng)隊(duì)列掃描”則會在返回此消息之前,按照下面的方法激活窗體。

?它沿著父鏈一直向上尋找該窗體的“最終頂層父窗體”,直到相遇。

?它用SendMessage向該窗體的“最終頂層父窗體”發(fā)送一個(gè)WM_MOUSEACTIVATE消息。

?從WM_MOUSEACTVATE返回的值將在下面被測試:

a)       如果返回的值為空、MA_ACTIVATE或者MA_ACTIVATEANDEATActivateWindow函數(shù)將被調(diào)用去激活那個(gè)“最終頂層父窗體”。

b)      如果返回的值是MA_NOACTIVATE或者MA_NOACTIVATEANDEAT,窗體則不被激活。

注意:MA_ACTIVATEANDEATMA_NOACTIVATEANDEAT會導(dǎo)致“鼠標(biāo)鍵按下”事件從系統(tǒng)隊(duì)列中被刪除,而不會生成一個(gè)鼠標(biāo)按下消息。

c)      最終,一個(gè)WM_SETCURSOR消息被發(fā)送到窗體,充許窗體設(shè)置指針的輪廓。

10. 如果鼠標(biāo)鉤子被調(diào)用,并且當(dāng)前的鼠標(biāo)事件從系統(tǒng)隊(duì)列中被刪除了,則檢查“基于計(jì)算機(jī)訓(xùn)練”(CBT)的鉤子。如果安裝有有一個(gè)CBT鉤子,將會攜帶HCBT_CLICKSKIPPED鉤子碼代調(diào)用它。

11. 按鍵狀態(tài)表包含了三個(gè)用于跟蹤鼠標(biāo)按鍵狀態(tài)的入口。這些按鍵被分配予虛擬鍵代碼(VK_LBUTTONVK_RUTTONVC_MBUTTON),它們和GetKeyState一起始用去確事實(shí)上鼠標(biāo)鍵是彈起還是按下。在返回鼠標(biāo)消息之前,“系統(tǒng)隊(duì)列掃描”代碼會(為彈起或按下消息)設(shè)置按鍵狀態(tài)表并且從系統(tǒng)隊(duì)列中刪除消息。如果PeekMessage被調(diào)用時(shí)攜帶PM_NOREMOVE,則按鍵狀態(tài)表不會被修改。

 

處理系統(tǒng)隊(duì)列中的鍵盤事件

1.  檢查是否Ctrl鍵被按下和當(dāng)前的事件是否ESC鍵按。如果是,該用戶——直接窗體——會顯示任務(wù)管理器窗體。一個(gè)WM_SYSCOMMAND消息將被發(fā)送到激活的窗體,并且參數(shù)wParamSC_TASKLIT。然后鍵盤按下事件從系統(tǒng)隊(duì)列中被刪除,“系統(tǒng)隊(duì)列掃描”代碼又將重新從頭開始。如果此激活的窗體是一個(gè)系統(tǒng)模塊或者是一個(gè)被顯示出來的“硬”系統(tǒng)模塊消息框(比如一個(gè)“INT24小時(shí)系統(tǒng)錯(cuò)誤消息框,或一個(gè)使用MB_ICONHANDMB_SYSTEMMODAL參數(shù)的MessageBox函數(shù))的事件,將會被拋棄。

2.  下一步,試著去查看當(dāng)前的事件是不是一個(gè)Print Screen鍵的按下事件。如果是,任意一個(gè)激活的窗體或整個(gè)桌面將被做為一個(gè)位圖快照,保存到剪貼板中。如果Alt鍵被按下,一幅激活窗體的圖像被復(fù)制到剪貼板中;如果沒有,則是整個(gè)桌面被復(fù)制。然后Print Screen鍵按下事件從系統(tǒng)隊(duì)列中被刪除,“系統(tǒng)隊(duì)列掃描”代碼又將重新從頭開始。如果顯示了一個(gè)“硬”系統(tǒng)模塊消息框,則此操作被忽略。

3.  下一步檢測熱鍵。使用程序管理器,用戶可以定義用來運(yùn)行一個(gè)應(yīng)用程序的擊鍵事件。這些擊鍵被稱為熱鍵。如果當(dāng)前的事件是一個(gè)按鍵事件,將會被測試是否與定義過的熱鍵匹配。如果發(fā)現(xiàn)匹配,一個(gè)WM_SYSCOMMAND消息將被發(fā)送到激活的窗體,并且參數(shù)wParamSC_HOTKEY。然后鍵盤按下事件從系統(tǒng)隊(duì)列中被刪除,“系統(tǒng)隊(duì)列掃描”代碼又將重新從頭開始。如果此激活的窗體是一個(gè)系統(tǒng)模塊或者是一個(gè)被顯示出來的“硬”系統(tǒng)模塊消息框,該測試被跳過。

4.  一般情況下,所有的鍵盤消息(如WM_KEYDOWNWM_CHAR等等)前往具有輸入焦點(diǎn)的窗體。如果這個(gè)具有輸入焦點(diǎn)的窗體與另一個(gè)當(dāng)前執(zhí)行的任務(wù)相關(guān)聯(lián),那么該事件會被留在系統(tǒng)隊(duì)列中,并且那個(gè)擁有“有焦點(diǎn)的窗體”的任務(wù)會被喚醒(如果休眠了)。“系統(tǒng)隊(duì)列掃描”代碼會像沒要發(fā)現(xiàn)任何要處理的事件一樣,返回到主GetMessage/PeekMessage代碼。請參閱下面的“讓步與休眠的不同”和“應(yīng)用程序如何被喚醒”以獲得更多的信息。

5.  如果遇到了沒有任何一個(gè)窗體具有輸入焦點(diǎn)的情形,鍵盤消息會直接前往當(dāng)前激活的窗體,而不會被翻譯成為系統(tǒng)鍵消息(如WM_SYSKEYDOWWM_SYSCHAR,等等)。

6.  與所有指定的消息過濾器進(jìn)行對照,核查此消息。(請參閱下面的“消息范圍過濾和窗體句柄過濾”)如果該消息不匹配過濾器,則重新從頭開始“系統(tǒng)隊(duì)列掃描”代碼,查看隊(duì)列中的下一個(gè)消息。

7.  如果事件被返到了當(dāng)前的任務(wù),它將從系統(tǒng)隊(duì)列中被刪除掉,除非PeekMessage被指定為PM_NOREMOVE標(biāo)記。請參閱下面的“PeekMessagePM_NOREMOVE標(biāo)記”以了解更多的關(guān)于不從隊(duì)列中刪除事件的信息。

8.  如果安裝有鍵盤鉤子,將在此刻被調(diào)用。如果事件從系統(tǒng)隊(duì)列中被刪除了,鉤子的調(diào)用將伴隨HC_ACTION屬性;如果事件未被從系統(tǒng)隊(duì)列中刪除,鉤子的調(diào)用將具有HC_NOREM屬性。

9.  如果鍵盤鉤子被調(diào)用,并且當(dāng)前的按鍵事件從系統(tǒng)隊(duì)列中被刪除了,則檢查現(xiàn)存的CBT鉤子。如果安裝有CBT鉤子,將調(diào)用它并攜帶HCBT_KEYSKIPPED鉤子碼。

10.              最后,消息被返加到主GetMessage/PeekMessage代碼。

 

PeekMessagePM_NOREMOVE

默認(rèn)情況下,每一個(gè)消息被返回到應(yīng)用程序后,PeekMessage GetMessage都會把消息和事件從系統(tǒng)隊(duì)列中刪除。然而有些時(shí)候,某個(gè)應(yīng)用程序可能需要掃描隊(duì)列中現(xiàn)存的消息而并不刪除它們。例如,某個(gè)應(yīng)用程序在做一些處理過程,這些處理過程期望“一但發(fā)現(xiàn)有可用的消息,就盡快終止”。

 

(未完,待續(xù))



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2176

posted on 2007-04-11 19:29 楊粼波 閱讀(20549) 評論(8)  編輯 收藏 引用

評論

# re: 深入GetMessage和PeekMessage 2007-04-25 16:35 劉彥凱

非常好  回復(fù)  更多評論   

# re: 深入GetMessage和PeekMessage 2008-04-08 11:40 小潘

太好了,高手啊!  回復(fù)  更多評論   

# re: 深入GetMessage和PeekMessage 2008-05-31 16:14 null

金山詞霸翻譯的?  回復(fù)  更多評論   

# re: 深入GetMessage和PeekMessage 2008-08-01 18:05 阿澈

能不能專門講一下鉤子啊? 它是怎樣形成的 在什么情況下做什么用 怎么撤銷的 多謝了~  回復(fù)  更多評論   

# re: 深入GetMessage和PeekMessage 2010-07-14 18:43 david_ming

8錯(cuò)  回復(fù)  更多評論   

# re: 深入GetMessage和PeekMessage 2012-05-30 14:56 你猜

麻痹!翻譯的好爛  回復(fù)  更多評論   

# re: 深入GetMessage和PeekMessage 2012-08-25 14:56 XXY

抄襲  回復(fù)  更多評論   

# re: 深入GetMessage和PeekMessage [未登錄] 2013-07-16 16:01 xyz

確實(shí)有點(diǎn)爛  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老鸭窝91久久精品色噜噜导演| 午夜视黄欧洲亚洲| 欧美另类一区二区三区| 亚洲专区在线| 亚洲人成小说网站色在线| 欧美中文在线观看| 久久国产免费| 你懂的国产精品永久在线| 亚洲第一黄色网| 9色国产精品| 欧美在线日韩| 欧美精品在线极品| 国产视频一区二区在线观看| 激情综合网激情| 亚洲精品精选| 欧美一区二区三区免费观看| 欧美国产先锋| 亚洲欧美日韩人成在线播放| 免费观看亚洲视频大全| 国产精品普通话对白| 好看不卡的中文字幕| 99国产精品视频免费观看| 欧美中文字幕在线播放| 亚洲国产欧美一区二区三区久久| 一区二区三区**美女毛片| 中国成人亚色综合网站| 国产精品久久久久久久免费软件 | 一本在线高清不卡dvd | 久久精品一二三| 亚洲国产综合在线| 欧美一区二区视频观看视频| 欧美粗暴jizz性欧美20| 国产婷婷色综合av蜜臀av| 99国产一区| 免费成人av在线| 性欧美1819性猛交| 欧美午夜电影在线| 99av国产精品欲麻豆| 免费日韩成人| 午夜精品久久久久久久久久久久久| 欧美精品一区二区蜜臀亚洲| 国内久久精品视频| 午夜视频一区| 亚洲一级片在线观看| 欧美日韩精品二区第二页| 最新日韩欧美| 欧美高清视频在线| 久久先锋资源| 黄色一区二区在线| 久久久久中文| 欧美在线视频免费播放| 国产欧美在线观看| 欧美在线精品免播放器视频| 亚洲一区二区四区| 国产精品国产三级国产专播精品人 | 亚洲精选中文字幕| 欧美大片在线观看一区二区| 欧美一区1区三区3区公司| 国产精品女同互慰在线看| 亚洲欧美久久| 亚洲综合电影| 国产亚洲欧美aaaa| 久久综合久久久久88| 久久久www| 亚洲高清自拍| 亚洲精品日韩激情在线电影 | 欧美亚洲色图校园春色| 国产日韩精品在线播放| 久久久91精品| 久久免费精品视频| 亚洲人成在线影院| 亚洲精品视频啊美女在线直播| 欧美人与禽性xxxxx杂性| 国产欧美日韩精品一区| 午夜精品福利一区二区三区av| 国产精品视频久久久| 欧美一级在线播放| 久久精品视频免费| 亚洲区欧美区| 99这里只有久久精品视频| 国产精品美女xx| 久久色在线观看| 欧美成人xxx| 亚洲欧美三级伦理| 久久久精彩视频| 99国产麻豆精品| 午夜精品久久久久99热蜜桃导演| 国产最新精品精品你懂的| 欧美激情1区2区3区| 欧美日韩高清免费| 久久―日本道色综合久久| 欧美高清视频在线观看| 亚洲欧美国产精品桃花| 久久久免费观看视频| 一个色综合导航| 久久精品一区二区三区不卡牛牛 | 欧美亚洲综合网| 久久久久久久久蜜桃| 一区二区三区日韩精品视频| 欧美在线精品免播放器视频| 日韩亚洲国产精品| 亚洲综合视频1区| 欧美a级在线| 欧美电影在线| 欧美电影免费观看大全| 一区二区三区精品久久久| 欧美成人精品激情在线观看| 亚洲午夜小视频| 久久久999国产| 一区二区三区日韩在线观看| 久久精品国产96久久久香蕉| 亚洲香蕉伊综合在人在线视看| 久久青草欧美一区二区三区| 午夜日韩激情| 欧美日韩国产美| 欧美福利精品| 狠狠色综合色综合网络| 国产精品99久久久久久有的能看 | 在线播放豆国产99亚洲| 亚洲欧美日韩一区在线| 亚洲图片激情小说| 欧美激情久久久久| 欧美高清视频在线观看| 亚洲福利一区| 麻豆成人91精品二区三区| 久久久久.com| 国产日韩在线看| 午夜视频在线观看一区二区| 亚洲欧美一区二区激情| 欧美午夜精品久久久| 亚洲人成人一区二区在线观看| 影音先锋亚洲视频| 99精品欧美一区| 夜夜夜精品看看| 一本色道久久综合亚洲精品婷婷 | 亚洲最新视频在线| 亚洲精品在线看| 欧美成人中文| 亚洲国产三级网| 亚洲美女性视频| 欧美日韩精品一区二区天天拍小说 | 狠狠色噜噜狠狠色综合久| 午夜一级在线看亚洲| 久久国产天堂福利天堂| 国产欧美1区2区3区| 欧美在线免费视屏| 亚洲国产一区在线| 亚洲精品一级| 久久精品国产一区二区电影| 久久精品夜色噜噜亚洲a∨| 国产日韩av一区二区| 久久久精彩视频| 亚洲电影毛片| 国产精品99久久久久久久vr| 欧美午夜精品久久久久久孕妇 | 午夜日本精品| 国产一区二区三区四区老人| 久久乐国产精品| 欧美成人国产| 中文亚洲免费| 国内精品久久久| 欧美阿v一级看视频| 一区电影在线观看| 久久―日本道色综合久久| 亚洲国产日韩欧美| 国产精品久久久| 久久婷婷国产综合尤物精品| 亚洲人成网站在线观看播放| 欧美在线观看视频| 亚洲国产日韩综合一区| 欧美日韩中文字幕| 久久精品动漫| av不卡在线看| 欧美91精品| 亚洲一区久久| 91久久精品一区二区三区| 国产精品久久久久秋霞鲁丝| 毛片基地黄久久久久久天堂| 亚洲一区二区三区在线播放| 欧美电影在线观看| 欧美一区三区二区在线观看| 亚洲免费观看高清完整版在线观看熊 | 国产色产综合色产在线视频| 久久久xxx| 一区二区欧美精品| 欧美福利精品| 久久精品一二三区| 中国成人在线视频| 最新中文字幕亚洲| 国产亚洲福利社区一区| 欧美日韩一区二区在线| 欧美mv日韩mv国产网站| 欧美亚洲视频一区二区| 一区二区电影免费在线观看| 亚洲国产毛片完整版| 久久久www成人免费精品| 亚洲欧美日韩精品久久亚洲区| 一区二区久久| 亚洲国产精品va在线看黑人动漫| 亚洲一区二区在线播放|