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++函式
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- C++ 建構函式和解構函式C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++中的回撥函式C++函式
- C++中函式呼叫的用法C++函式
- c++ Beep函式C++函式
- c++函式模板C++函式
- fill函式與memset函式的區別(c++)函式C++
- 118 C++中函式的過載C++函式
- [cpp]C++中的解構函式C++函式
- C++ functional庫中的仿函式C++Function函式
- C++入門記-建構函式和解構函式C++函式
- [C++] 成員函式指標和函式指標C++函式指標
- 深入C++成員函式及虛擬函式表C++函式
- c++ 函式指標C++函式指標
- 函式回撥(C++)函式C++
- c++的remove函式C++REM函式
- C++之memset函式C++函式
- C++解構函式C++函式
- C++ replace() 函式用法C++函式
- C++靜態函式C++函式
- C++(函式指標)C++函式指標
- C++函式模板案例C++函式
- C++ 序列操作函式C++函式
- C++函式過載C++函式
- Sql 中的 left 函式、right 函式SQL函式
- Rust中的into函式和from函式Rust函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- C++ 函式過載,函式模板和函式模板過載,選擇哪一個?C++函式
- C++行內函數、函式過載與函式預設引數C++函數函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- JavaScript中的compose函式和pipe函式JavaScript函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 關於C++當中的“模板函式”C++函式