天天看點

GetMessage

從調用線程的消息隊列中檢索消息。該函數排程傳入的發送消息,直到發送的消息可用于檢索。

與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視窗替換該視窗。這允許使用者移動它,調整大小,甚至關閉應用程式。

但是,這些是唯一可用的操作,因為應用程式實際上沒有響應。當處于調試器模式時,系統不會生成鬼視窗。