PeekMessage
調(diào)度傳入的發(fā)送消息,檢查發(fā)送消息的線程消息隊(duì)列,并檢索消息(如果有的話)。
BOOL WINAPI PeekMessage(_Out_ LPMSG lpMsg,_In_opt_ HWND hWnd,_In_ UINT wMsgFilterMin,_In_ UINT wMsgFilterMax,_In_ UINT wRemoveMsg );參數(shù)
lpMsg [out]
類型:LPMSG
指向接收消息信息的MSG結(jié)構(gòu)的指針。
hWnd [in,可選]
類型:HWND
要檢索其消息的窗口的句柄。該窗口必須屬于當(dāng)前線程。
如果hWnd為NULL,PeekMessage將檢索屬于當(dāng)前線程的任何窗口的消息,以及hwnd值為NULL的當(dāng)前線程的消息隊(duì)列中的任何消息(請參閱MSG結(jié)構(gòu))。因此,如果hWnd為NULL,則處理窗口消息和線程消息。
如果hWnd為-1,PeekMessage僅檢索當(dāng)前線程的消息隊(duì)列中的消息,其中hwnd值為NULL,即PostMessage(hWnd參數(shù)為NULL)或PostThreadMessage發(fā)布的線程消息 。
wMsgFilterMin [in]
類型:UINT
要檢查的消息范圍內(nèi)的第一條消息的值。使用WM_KEYFIRST(0x0100)指定第一個(gè)鍵盤消息或WM_MOUSEFIRST(0x0200)來指定第一個(gè)鼠標(biāo)消息。
如果wMsgFilterMin和wMsgFilterMax都為零,PeekMessage返回所有可用的消息(即不執(zhí)行范圍過濾)。
wMsgFilterMax [in]
類型:UINT
要檢查的消息范圍內(nèi)的最后一條消息的值。使用WM_KEYLAST指定最后一個(gè)鍵盤消息或WM_MOUSELAST來指定最后一個(gè)鼠標(biāo)消息。
如果wMsgFilterMin和wMsgFilterMax都為零,PeekMessage返回所有可用的消息(即不執(zhí)行范圍過濾)。
wRemoveMsg [in]
類型:UINT
指定消息的處理方式。此參數(shù)可以是以下值中的一個(gè)或多個(gè)。
| PM_NOREMOVE為0x0000 | PeekMessage處理后消息不會(huì)從隊(duì)列中刪除。 |
| PM_REMOVE0×0001 | PeekMessage處理后消息將從隊(duì)列中刪除。 |
| PM_NOYIELD0×0002 | 防止系統(tǒng)釋放等待呼叫者空閑的任何線程(請參閱WaitForInputIdle)。 將此值與PM_NOREMOVE或PM_REMOVE組合。 |
?默認(rèn)情況下,處理所有消息類型。要指定只處理某些消息,請指定以下一個(gè)或多個(gè)值。
| PM_QS_INPUT(QS_INPUT << 16) | 處理鼠標(biāo)和鍵盤消息。 |
| PM_QS_PAINT(QS_PAINT << 16) | 處理油漆消息。 |
| PM_QS_POSTMESSAGE((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER)<< 16) | 處理所有發(fā)布的消息,包括計(jì)時(shí)器和熱鍵。 |
| PM_QS_SENDMESSAGE(QS_SENDMESSAGE << 16) | 處理所有發(fā)送的消息。 |
?返回值
類型:BOOL
如果消息可用,則返回值不為零。
如果沒有可用的消息,返回值為零。
備注
的PeekMessage檢索與由所述標(biāo)識的窗口相關(guān)聯(lián)的消息的hWnd由指定的參數(shù)或任何其子的IsChild功能,并且通過給定的消息的值的范圍內(nèi)wMsgFilterMin和wMsgFilterMax參數(shù)。
請注意,應(yīng)用程序只能使用wMsgFilterMin和wMsgFilterMax參數(shù)中的低字; 高字保留給系統(tǒng)。
請注意,PeekMessage始終檢索WM_QUIT消息,無論您為wMsgFilterMin和wMsgFilterMax指定了哪些值。
在此呼叫期間,系統(tǒng)提供待處理的非排隊(duì)消息,即使用SendMessage,SendMessageCallback,SendMessageTimeout或SendNotifyMessage函數(shù)發(fā)送到調(diào)用線程擁有的窗口的消息。
然后檢索與指定的過濾器匹配的第一個(gè)排隊(duì)的消息。該系統(tǒng)還可以處理內(nèi)部事件。如果未指定過濾器,則按以下順序處理消息:
- 發(fā)送信息
- 發(fā)布消息
- 輸入(硬件)消息和系統(tǒng)內(nèi)部事件
- 發(fā)消息(再次)
- WM_PAINT消息
- WM_TIMER消息
所述的PeekMessage功能通常不會(huì)刪除WM_PAINT從隊(duì)列中的消息。WM_PAINT消息保留在隊(duì)列中,直到它們被處理。但是,如果WM_PAINT消息具有NULL更新區(qū)域,PeekMessage將其從隊(duì)列中刪除。
如果頂級窗口停止響應(yīng)消息超過幾秒鐘,系統(tǒng)會(huì)將該窗口視為不響應(yīng),并使用具有相同z階,位置,大小和視覺屬性的ghost窗口替換該窗口。這允許用戶移動(dòng)它,調(diào)整大小,甚至關(guān)閉應(yīng)用程序。
但是,這些是唯一可用的操作,因?yàn)閼?yīng)用程序?qū)嶋H上沒有響應(yīng)。當(dāng)一個(gè)應(yīng)用程序被調(diào)試時(shí),系統(tǒng)不會(huì)生成一個(gè)鬼窗口。
總結(jié)
以上是生活随笔為你收集整理的PeekMessage的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQ属性操作
- 下一篇: final关键字细节