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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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技術組

作于:19921111

 

Creamdog

譯于:2002313

 

譯者的話

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

概念

 

這篇文章解釋了GetMessagePeekMessage的內部運作方式,同時也是一類與“消息及消息在16 MS-DOS?/Microsoft? Windows?環境之下的影響”相關文章的基礎。我們將討論下面這些主題:

·系統和應用程序隊列(譯者注:以下簡稱為“程序隊列”)

·GetMessagePeekMessage函數

·消息過濾

·WM_QUIT消息

·讓步和休眠

·讓步的問題

·WaitMessage

 

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

 

隊列

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

 

硬件輸入:系統隊列

Windows有一些驅動程序,它們負責響應來自于鍵盤和鼠標等硬件的中斷服務。在中斷時間中,鍵盤和鼠標驅動程序會調用USER.EXE中指定的一些入口點去報告一個事件的發生。在Windows中服務于光筆計算的光筆驅動程序,同樣會在原始的光筆事件中調用這些入口點。

  

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

 

發送的消息和程序隊列

當一個應用程序開始時,一個隊列將會因此而被創建。程序隊列(有時會稱為任務隊列)常常用于儲存“正在被發往應用程序的一個窗口” 的消息。唯一常駐程序隊列的消息是那些由PostMessagePostAppMessage明確發送的消息。(SendMessage從不使用系統隊列)PostQuitMessage函數不會發送一個消息到程序隊列。(WM_QUIT消息將在下文中論討)

默認的,每個程序隊列可以保持八個消息。一般情況下這是相當足夠的,因為PostMessage極少被使用。但是如果一個應用程序試圖強制調用很多的PostMessage到某個應用程序時,那么這類應用程序將會用使用SetMessageQueue函數來增加消息隊列的長度。你必須小心的使用SetMessageQueue函數,因為它無論何時都會先刪掉當前的程序隊列,并創建一個預期大小的新隊列,此時任何在舊隊列中的消息都會被銷毀。因此,它必須在你的WinMain例程中在所有其它的應用程序編程接口(API)之前調用或在應用程序用PeekMessage明確的清除隊列之后調用。

 

GetMessagePeekMessage是怎樣工作的

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

 

GetMessagePeekMessage邏輯

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

提示:下面所示步驟按照消息類型的優先權進行排序。舉個例子,發送的消息總在鍵盤和鼠標消息之前被返回,而鍵盤和鼠標的消息又會在繪圖(paint)消息之前反回,以此類推。

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

2.         與所有消息和窗體句柄過濾器進行對照,核查此消息。如果此消息不匹配指定的過濾器,就會把此消息留在程序隊列中。如果隊列中在此消息的后面還有其它消息,則會轉向對下一個消息的處理。

3.         如果在程序隊列中沒有消息了,就掃描系統隊列中的事件。這個過程相當復雜,并且我們將在下面的“掃描系統隊列”小節中XX。一般來講,在系統隊列首部的事件是供這個應用程序所使用的,系統會將其轉化為消息,并將消息返回到這個應用程序中(它不會首先被置于應用隊列中)。注意,這個掃描系統隊列的過程可能導致當前活動的應用程序將控制權讓給其它的應用程序。

4.         如果在系統隊列中沒有等待處理的事件,則核查所有與當前應用程序(任務)相關的窗體以確定更新區域。當一個窗體的一部分需要被重繪時,一個更新區域就被創建在那個窗體部分之上。這個區域將與此窗體中現存的所有更新區域相結合,并儲存在內部窗體結構體中。如果GetMessagePeekMessage在這個任務中發現某些窗體有一些未處理的更新區域,將產生一個WM_PAINT消息,并為那個窗體返回到應用程序中。WM_PAINT從不駐留在任何隊列中。此時,一個應用程序將為某個窗體不斷的接收WM_PATIN消息,直到更新區域由BeginPaint/EndPaintValidateRect,或ValidateRgn所清除。

5.         如果這個任務中沒有任何窗體需要被更新,GetMessagePeekMessage就會在這一點讓出控制權,除非PeekMessage調用被設置為PM_NOYIELD屬性。

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

7.         如果這個應用程序沒有計時器事件服務,并且一個應用程序正在被終止,代碼將嘗試去縮小圖形設備界面(GDI)的本地內存堆。一些應用程序,比如繪圖應用程序(像Paintbrush?),為GDI分配了大量的堆內存。當應用程序終止時釋放這些對象時,會使GDI本地內存堆被空閑空間填滿而膨脹。為了恢復這些空閑的空間, GetMessage/PeekMessage處理中,LocalShrink將在這一點被調用于GDI的內存堆。這個被完成一次,(每次)一個應用程序將終止。

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

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

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

 

WH_GETMESSAGE鉤子

GetMessagePeekMessage將一個消息返回到調用的應用程序之前,會做一個驗證是否存在一個WH_GETMESSAGE鉤子的測試。如果有一個已經被安裝了,那這個鉤子會被調用。如果PeekMessage沒有發現可用的消息并返回一個空值時,這個鉤子將不會被調用。在鉤子處理過程中,你不可能得知是到底是GetMessage被調用還是PeekMessage被調用。

 

掃描系統隊列

綜上所述,在系統隊列中的事件僅僅是硬件事件的記錄。那些代碼掃描系統隊列的主要任務是,從這些事件中創建消息,并確定哪一個窗體將接收這個消息。

代碼第一次在系統隊列首部找到事件時,并不會馬上將其刪除。因為鼠標和鍵盤事件只是隊列中的兩種事件,而代碼會分枝(譯者注:類似于C語言中的switch語句)并單獨處理每一種類型的事件。

 

處理系統隊列中的鼠標事件

下面是處理鼠標事件的步驟。

1.  首先,將計算該事件屏幕坐標的相應窗體。此計算(調用窗體點擊測試)以桌面窗體開始,從頭至尾的掃描細統中的每一個窗體(包括子窗體),直到找到一個包含這個鼠標坐標點的窗體,并且這個窗體沒有任何同樣包含這個坐標點的子窗體。

2. 鼠標事件的窗體點擊測試

例如:如果圖2中的箭頭代表當前的鼠標位置,任何的鼠標行為,像單擊鼠標鍵,將生成一個會在B窗體中產生消息的事件。

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

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

4.  一個消息從鼠標事件中構造出來。

5.  如果鼠標點擊測試確定該事件發生在一個窗體的非客戶區,如邊框或標題欄,那么該構造出的消息映射到它相應的非客戶區消息中。例如:一個WM_MOUSEMOVE事件會被映謝為WM_NCMOUSEMOVE消息。

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

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

8.  如果安裝了鼠標鉤子,它將在此刻被調用。如果鼠標鉤子返回了一個非零值,那么該鼠標事件被忽略,并從系統隊列中被刪除,然后重新從頭開始“系統隊列掃描”代碼。如果鉤子返回零,則繼續處理。

9.  如果消息是一個“鼠標鍵按下”消息,“系統隊列掃描”則會在返回此消息之前,按照下面的方法激活窗體。

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

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

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

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

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

注意:MA_ACTIVATEANDEATMA_NOACTIVATEANDEAT會導致“鼠標鍵按下”事件從系統隊列中被刪除,而不會生成一個鼠標按下消息。

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

10. 如果鼠標鉤子被調用,并且當前的鼠標事件從系統隊列中被刪除了,則檢查“基于計算機訓練”(CBT)的鉤子。如果安裝有有一個CBT鉤子,將會攜帶HCBT_CLICKSKIPPED鉤子碼代調用它。

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

 

處理系統隊列中的鍵盤事件

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

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

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

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

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

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

7.  如果事件被返到了當前的任務,它將從系統隊列中被刪除掉,除非PeekMessage被指定為PM_NOREMOVE標記。請參閱下面的“PeekMessagePM_NOREMOVE標記”以了解更多的關于不從隊列中刪除事件的信息。

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

9.  如果鍵盤鉤子被調用,并且當前的按鍵事件從系統隊列中被刪除了,則檢查現存的CBT鉤子。如果安裝有CBT鉤子,將調用它并攜帶HCBT_KEYSKIPPED鉤子碼。

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

 

PeekMessagePM_NOREMOVE

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

 

(未完,待續)



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

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

評論

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

非常好  回復  更多評論   

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

太好了,高手啊!  回復  更多評論   

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

金山詞霸翻譯的?  回復  更多評論   

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

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

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

8錯  回復  更多評論   

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

麻痹!翻譯的好爛  回復  更多評論   

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

抄襲  回復  更多評論   

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

確實有點爛  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线观看成人av电影| 亚洲国产另类精品专区| 国产伦精品一区二区三| 国产精品啊v在线| 欧美午夜片欧美片在线观看| 欧美丝袜第一区| 国产精品视频免费一区| 狠狠色丁香婷婷综合影院| 亚洲高清不卡av| 99国产精品一区| 午夜久久一区| 久久在线免费观看视频| 免费观看成人www动漫视频| 亚洲韩国青草视频| 艳女tv在线观看国产一区| 欧美一级大片在线观看| 欧美1区2区| 国产精品永久在线| 亚洲人成网站999久久久综合 | 亚洲激情视频在线| 日韩视频在线免费| 性色av一区二区三区红粉影视| 美女在线一区二区| 在线综合+亚洲+欧美中文字幕| 久久久久久91香蕉国产| 欧美日韩亚洲国产精品| 娇妻被交换粗又大又硬视频欧美| 亚洲精选一区| 久久久久久久一区| 中文久久精品| 美女久久一区| 国产日韩在线看片| 正在播放欧美一区| 欧美 日韩 国产 一区| 中文精品99久久国产香蕉| 你懂的视频欧美| 国产一区日韩欧美| 亚洲自拍偷拍色片视频| 亚洲欧洲综合另类在线| 免费成人小视频| 国户精品久久久久久久久久久不卡 | 久久激情久久| 欧美亚一区二区| 亚洲精品一区二| 欧美成人在线网站| 亚洲尤物影院| 欧美—级a级欧美特级ar全黄| 麻豆freexxxx性91精品| 欧美va亚洲va日韩∨a综合色| 国产喷白浆一区二区三区| 在线午夜精品| 亚洲国产综合91精品麻豆| 小嫩嫩精品导航| 国产麻豆日韩欧美久久| 亚洲欧美日韩一区在线| 亚洲深夜福利网站| 国产精品久久国产精品99gif| 一本久久综合亚洲鲁鲁五月天| 欧美国产日本韩| 免费成人av在线| 亚洲精品日韩一| 91久久久亚洲精品| 欧美黄色精品| 一区二区三区视频在线| 99视频精品免费观看| 欧美午夜精品久久久| 亚洲欧美国产毛片在线| 亚洲在线视频观看| 国内精品伊人久久久久av影院 | 欧美亚洲综合另类| 亚洲性图久久| 国产免费亚洲高清| 榴莲视频成人在线观看| 免费看黄裸体一级大秀欧美| 999亚洲国产精| 一本久久a久久精品亚洲| 国产精品乱子乱xxxx| 久久精品综合| 蜜桃久久av一区| 99在线|亚洲一区二区| 亚洲自拍偷拍色片视频| 影视先锋久久| 艳女tv在线观看国产一区| 国产日韩欧美一区二区三区四区| 老司机午夜精品视频| 欧美日本韩国一区| 欧美一区二区三区久久精品| 国产一区二区三区高清| 免费观看成人网| 欧美日韩一区二区在线观看视频| 先锋影音国产精品| 欧美h视频在线| 午夜影视日本亚洲欧洲精品| 老司机免费视频久久| 中文网丁香综合网| 久久久久久久激情视频| a91a精品视频在线观看| 性欧美精品高清| 一本到高清视频免费精品| 亚洲欧美日产图| 99热精品在线| 在线国产亚洲欧美| 欧美了一区在线观看| 国产精品自在线| 久久久精品久久久久| 免费观看国产成人| 亚洲伊人久久综合| 欧美中文在线视频| 99精品欧美一区二区蜜桃免费| 亚洲中无吗在线| 亚洲精品久久嫩草网站秘色 | 欧美黄色大片网站| 欧美在线看片a免费观看| 欧美韩日一区二区三区| 噜噜噜在线观看免费视频日韩| 欧美日韩一区二区在线视频| 免费观看在线综合| 国产一区二区精品久久| 亚洲一区二区网站| 亚洲一级黄色| 欧美精品免费视频| 免费观看国产成人| 在线免费高清一区二区三区| 欧美一区二区三区另类 | 欧美一区二区三区在线视频 | 欧美成人官网二区| 国产亚洲一区二区三区在线播放| 99热精品在线观看| 日韩一级黄色av| 欧美 日韩 国产在线| 欧美成人一品| 在线观看视频一区二区| 久久精品在线视频| 久久久久久久精| 韩国av一区| 久久在线免费| 亚洲第一免费播放区| 一区二区三区在线免费播放| 久久国产精品99精品国产| 久久久久国色av免费观看性色| 国产性做久久久久久| 欧美一区二区高清| 久久综合久久综合九色| 在线观看欧美视频| 欧美激情在线观看| 亚洲精选久久| 亚洲一区三区在线观看| 国产精品一区二区在线| 欧美亚洲一区三区| 欧美高潮视频| 亚洲性感激情| 国产一区二区三区自拍| 久久婷婷国产综合精品青草| 亚洲国产成人久久综合| 一区二区三区 在线观看视| 国产精品乱人伦中文| 久久国产欧美精品| 亚洲精选中文字幕| 免费看的黄色欧美网站| 亚洲精品视频在线播放| 国产亚洲精品高潮| 久久免费一区| 99re成人精品视频| 欧美日韩1区2区3区| 一区二区高清在线| 欧美综合77777色婷婷| 亚洲国产高潮在线观看| 欧美日韩成人一区二区| 午夜精品视频在线| 欧美激情在线狂野欧美精品| 一区二区av在线| 国产一区二区三区观看| 欧美大片免费观看在线观看网站推荐| 亚洲日韩欧美视频| 久久精品视频在线观看| 日韩亚洲精品在线| 国产真实久久| 欧美色中文字幕| 久久久久国产成人精品亚洲午夜| 亚洲精品免费一区二区三区| 久久久久久九九九九| 亚洲一区二区三区欧美| 精品999成人| 国产情侣久久| 国产精品福利在线观看网址| 毛片av中文字幕一区二区| 亚洲欧美日韩人成在线播放| 亚洲经典三级| 欧美11—12娇小xxxx| 久久国产精品久久久久久久久久| 夜夜嗨av一区二区三区四区| 在线欧美一区| 国模一区二区三区| 国产农村妇女精品| 国产精品久久久久久久久婷婷 | 亚洲一区三区电影在线观看| 亚洲欧洲日本国产| 欧美gay视频激情| 久久久久久久一区二区| 久久福利视频导航|