c++中訊息函式 -- GetMessage函式

edwardking888發表於2014-07-29

此函式從呼叫執行緒的訊息佇列中取出一個訊息。此函式傳送訊息佇列的訊息直到這個訊息適合檢索。然後把檢索到的訊息賦值給MSG結構體。

       PeektMessage函式和GetMessage不同,PeekMessage不會等待一個訊息傳送到訊息佇列時才返回。


  1. BOOL GetMessage(  
  2.   LPMSGlpMsg,         // message information  
  3.   HWND hWnd,           // handle to window  
  4.   UINT wMsgFilterMin,  // first message  
  5.   UINT wMsgFilterMax   // last message  
  6. );  


lpMsg

       指向從執行緒的訊息佇列接收訊息的MSG結構體。

hWnd

        需要檢索訊息的窗體控制程式碼。這個窗體必須屬於呼叫執行緒,下面是指定的值。

解釋

 NULL

GetMessage檢索任何屬於呼叫執行緒窗體的訊息,並且通過PostThreadMessage函式傳送訊息到呼叫執行緒

wMsgFilterMin

指定被檢索的最小訊息值的整數。用WM_KEYFIRST指定第一個鍵盤訊息或者WM_MOUSEFIRST指定第一個滑鼠訊息。

此處用WM_INPUT,wMsgFilterMax中只能用WM_INPUT型別訊息。

wMsgFilterMax  

指定被檢索的最大訊息值的整數。用WM_KEYLAST指定最後一個鍵盤訊息或者WM_MOUSELAST指定最後一個滑鼠訊息。

此處用WM_INPUT,wMsgFilterMin中只能用WM_INPUT型別訊息。

如果wMsgFilterMin和wMsgFiterMax都為0,GetMessage返回所有合適的訊息(也就是說沒有過濾條件)。

返回值

如果函式檢索除WM_QUIT訊息之外的訊息,返回非0。

如果函式檢索WM_QUIT訊息,函式返回0。

如果有錯誤發生,返回值為-1。例如,如果hWnd是一個非法的視窗控制程式碼或者lpMsg是一個非法的指標,函式返回錯誤。可以通過呼叫GetLastError函式獲得詳細的錯誤資訊。

因為返回值可以非0,0或者-1,避免向下面的程式碼發生:

while(GetMessage(lpMsg,hWnd,0,0))……

返回-1的可能性意味著這個程式碼可以導致致命的應用錯誤。相反,可以使用下面的程式碼:


  1. BOOL bRet;  
  2. while(bRet = GetMessage(&msg,hWnd,0,0) !=0)  
  3. {  
  4.        if(bRet== -1)  
  5.        {  
  6.        //處理錯誤和可能的退出  
  7. }  
  8. else  
  9. {  
  10.        TranslateMessage(&msg);  
  11.        DispatchMessage(&msg);  
  12. }  
  13. }  


說明

應用通常使用返回值決定是否結束主訊息迴圈並且退出程式。

GetMessage函式檢索由hWnd引數標識的和窗體關聯的,或者由IsChild函式指定的它們的子窗體,並且在wMsgFilterMin和wMsgFilterMax引數指定的訊息範圍之間訊息。應用只能用wMsgFilterMin和wMsgFilterMax引數的低字位,高字位是系統保留。

GetMassage函式總是檢索WM_QUIT訊息,不管它是否在wMsgFilterMin和wMsgFilterMax指定的範圍內。

在呼叫期間,系統用SendMessage、SendMessageCallback,、SendMessageTimeout或者SendNotifyMessage函式傳送待處理的、非佇列的訊息,也就是,訊息傳送給屬於呼叫執行緒的窗體,然後匹配指定的過濾條件的第一個訊息佇列被檢索。系統也處理內部事件,如果沒有指定過濾器,訊息處理按照下面的順序:

  •  Sentmessages(傳送訊息)
  •  Postedmessages(推送訊息)
  •  輸入(硬體)訊息或者系統內部訊息
  •  Sentmessages (again)(傳送訊息)
  • WM_PAINT訊息
  • WM_TIMER訊息

在推送訊息之前,用wMsgFilterMin和wMsgFilterMax引數檢索輸入訊息。

GetMessage不能從訊息佇列中移除WM_PAINT訊息。此訊息一直在訊息佇列中直到被處理。

如果一個高階別的窗體一段時間內停止響應訊息,系統認為窗體沒有響應,然後使用一個映象的窗體代替此窗體,映象窗體和此窗體有著相同的Z座標、位置、大小和視覺屬性。這個映象窗體允許使用者刪除、改變大小或者甚至關閉。但是,此種情況僅僅在窗體真正不能響應的情況下產生,當在除錯模式下,系統不能產生映象窗體。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-1241487/,如需轉載,請註明出處,否則將追究法律責任。

相關文章