從調用線程的消息隊列中檢索消息。該函數排程傳入的發送消息,直到發送的消息可用于檢索。
與GetMessage不同,PeekMessage函數不等待傳回前發送消息。
BOOL WINAPI GetMessage(
_Out_ LPMSG lpMsg,
_In_opt_ HWND hWnd,
_In_ UINT wMsgFilterMin,
_In_ UINT wMsgFilterMax
);
參數
lpMsg [out]
類型:LPMSG
指向從線程的消息隊列接收消息資訊的MSG結構的指針。
hWnd [in,可選]
類型:HWND
要檢索其消息的視窗的句柄。該視窗必須屬于目前線程。
如果hWnd為NULL,則GetMessage将檢索屬于目前線程的任何視窗的消息,以及hwnd值為NULL的目前線程的消息隊列中的任何消息(請參閱MSG結構)。是以,如果hWnd為NULL,則處理視窗消息和線程消息。
如果hWnd為-1,則GetMessage僅檢索目前線程的消息隊列中的hwnd值為NULL的消息,即PostMessage釋出的線程消息 (hWnd參數為NULL時)或PostThreadMessage。
wMsgFilterMin [in]
類型:UINT
要檢索的最低消息值的整數值。使用WM_KEYFIRST(0x0100)指定第一個鍵盤消息或WM_MOUSEFIRST(0x0200)來指定第一個滑鼠消息。
在這裡和wMsgFilterMax中使用WM_INPUT來僅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都為零,GetMessage傳回所有可用的消息(即不執行範圍過濾)。
wMsgFilterMax [in]
類型:UINT
要檢索的最高消息值的整數值。使用WM_KEYLAST指定最後一個鍵盤消息或WM_MOUSELAST來指定最後一個滑鼠消息。
在這裡和wMsgFilterMin中使用WM_INPUT來僅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都為零,GetMessage傳回所有可用的消息(即不執行範圍過濾)。
傳回值
類型:BOOL
如果函數檢索到除WM_QUIT之外的消息,則傳回值不為零。
如果函數檢索到WM_QUIT消息,傳回值為零。
如果有錯誤,傳回值為-1。例如,如果hWnd是無效的視窗句柄或lpMsg是無效指針,則該函數将失敗。要擷取擴充錯誤資訊,請調用GetLastError。
因為傳回值可以是非零,零或-1,是以避免這樣的代碼:
while(GetMessage(lpMsg,hWnd,0,0))...
在hWnd是無效參數(例如引用已經被破壞的視窗)的情況下,傳回值的可能性意味着這樣的代碼可能導緻緻命的應用程式錯誤。而是使用如下代碼:
BOOL bRet;
while((bRet = GetMessage(&msg,hWnd,0,0))!= 0)
{
if(bRet == -1)
{
//處理錯誤并可能退出
}
其他
{
的TranslateMessage(MSG);
DispatchMessage函數(MSG);
}
}
備注
應用程式通常使用傳回值來确定是否結束主消息循環并退出程式。
所述的GetMessage函數檢索與由辨別的視窗相關聯的消息的hWnd參數或其任何兒童,由指定IsChild功能,并且通過給定的消息的值的範圍内wMsgFilterMin和wMsgFilterMax參數。
請注意,應用程式隻能使用wMsgFilterMin和wMsgFilterMax參數中的低字; 高字保留給系統。
請注意,GetMessage始終檢索WM_QUIT消息,無論您為wMsgFilterMin和wMsgFilterMax指定了哪些值。
在此呼叫期間,系統提供待處理的非排隊消息,即使用SendMessage,SendMessageCallback,SendMessageTimeout或SendNotifyMessage函數發送到調用線程擁有的視窗的消息。然後檢索與指定的過濾器比對的第一個排隊的消息。
該系統還可以處理内部事件。如果未指定過濾器,則按以下順序處理消息:
- 發送資訊
- 釋出消息
- 輸入(硬體)消息和系統内部事件
- 發消息(再次)
- WM_PAINT消息
- WM_TIMER消息
要在釋出消息之前檢索輸入消息,請使用wMsgFilterMin和wMsgFilterMax參數。
GetMessage不會從隊列中删除WM_PAINT消息。消息保留在隊列中,直到處理完畢。
如果頂級視窗停止響應消息超過幾秒鐘,系統會将該視窗視為不響應,并使用具有相同z階,位置,大小和視覺屬性的ghost視窗替換該視窗。這允許使用者移動它,調整大小,甚至關閉應用程式。
但是,這些是唯一可用的操作,因為應用程式實際上沒有響應。當處于調試器模式時,系統不會生成鬼視窗。