c++中訊息函式 -- GetMessage函式
此函式從呼叫執行緒的訊息佇列中取出一個訊息。此函式傳送訊息佇列的訊息直到這個訊息適合檢索。然後把檢索到的訊息賦值給MSG結構體。
PeektMessage函式和GetMessage不同,PeekMessage不會等待一個訊息傳送到訊息佇列時才返回。
- BOOL GetMessage(
- LPMSGlpMsg, // message information
- HWND hWnd, // handle to window
- UINT wMsgFilterMin, // first message
- UINT wMsgFilterMax // last message
- );
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的可能性意味著這個程式碼可以導致致命的應用錯誤。相反,可以使用下面的程式碼:
- BOOL bRet;
- while(bRet = GetMessage(&msg,hWnd,0,0) !=0)
- {
- if(bRet== -1)
- {
- //處理錯誤和可能的退出
- }
- else
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
說明
應用通常使用返回值決定是否結束主訊息迴圈並且退出程式。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++中函式指標與函式物件C++函式指標物件
- C++中strlen函式C++函式
- C/C++—— C++中函式重寫和函式過載C++函式
- 訊息鉤子函式入門篇函式
- C++函式中那些不可以被宣告為虛擬函式的函式C++函式
- C++中的strrev函式C++函式
- c++中內建函式C++函式
- C++中的函式指標和函式物件總結C++函式指標物件
- C++函式C++函式
- 【C++】函式C++函式
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- C++ 建構函式和解構函式C++函式
- C++的函式和模板函式 (轉)C++函式
- VC自定義訊息postmessage用法(訊息響應函式)函式
- C++中抽象類、虛擬函式和純虛擬函式C++抽象函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 訊息鉤子函式入門篇 (轉)函式
- 回撥函式、訊息和事件例程 (轉)函式事件
- C++中函式呼叫的用法C++函式
- C++中的函式簽名C++函式
- C++ 中的虛擬函式C++函式
- C++中的回撥函式C++函式
- C++的函式式革命C++函式
- C++ 類建構函式和解構函式C++函式
- C/C++—— C++中建構函式不能是虛擬函式的原因分析C++函式
- c++ Beep函式C++函式
- c++函式模板C++函式
- C++仿函式C++函式
- C++ Virtual函式C++函式
- 訊息佇列函式以及其簡單使用佇列函式
- fill函式與memset函式的區別(c++)函式C++
- 函式指標使用c++類成員函式函式指標C++
- [cpp]C++中的解構函式C++函式
- C++ functional庫中的仿函式C++Function函式
- C++中compare函式的使用C++函式
- C++中虛擬函式的作用C++函式
- 談談C++中的swap函式C++函式