Win32API 消息機制
阿新 • • 發佈:2017-05-15
long 鼠標位置 int pos 參數 機會 翻譯 term wpa
Win32API 消息機制
- windows平臺下,什麽是消息?
- 當系統通知窗口工作時,就采用消息的方式派發給窗口的窗口處理函數
- 消息組成的6大部件組合,缺一不可:
- 1 窗口句柄
- 每個win32的窗口程序,只要是有窗口,就不可能沒有窗口句柄,因為創建之初就生成了句柄,有如小車要上路就強制要求有個“車牌”。
- 2 消息ID
- 微軟給windows消息機制,設計1024個消息數字,這種數字的出現,就代表此種消息的出現。
- 3 消息的兩個參數(附帶信息)
- 任何一個消息都附帶兩個信息: 1 不同的消息,這兩個附帶的信息是不同的 2 一個用WPARAM 保存 ,另外一個用 LPARAM類型來保存。
- 4 消息產生的時間 (不關註,但不可缺少)
- 5 消息產生時的鼠標位置 (不關註,但不可缺少)
- 消息相關函數
- 1 GetMessage - 獲取本進程的消息
BOOL GetMessage(
LPMSG lpMsg, //存放獲取到的消息Buff
HWND hWnd, //窗口句柄
UINT wMsgFilterMin, //獲取消息的最小ID 默認0
UINT wMsgFilterMax //獲取消息的最大ID 默認0
); - LPMSG lpMsg, - 當獲得消息後,將消息的參數存放到MSG結構中。
- HWND hWnd, - 獲得hWnd所指定窗口的消息。
- UNIT wMsgFilterMin 和 UNIT wMsgFilterMax - 只能獲得由它們指定的消息範圍內的消息,如果都為0,表示沒有範圍。
- BOOL GetMessage(...) 這個函數的返回值非常重要
- while(GetMessage(...)){......} 返回0才能結束,然而能使得GetMessage函數返回0的消息只有一個:WM_QUIT 。
- PostQuitMessage(0); 預設了一個WM_QUIT消息。##助記:挖坑埋雷
- 2
TranslateMessage - 翻譯消息。將探尋消息,翻譯成字符消息。
BOOL TranslateMessage(
const MSG* lpMsg //要翻譯的消息地址
); - 檢查消息是不是按鍵的消息,不是按鍵消息,不做任何處理,繼續執行。
- 3
DispatchMessage - 派發消息。
LONG DispatchMessage(
const MSG* lpmsg
); - DispatchMessage(&msg,NULL,NULL,NULL)函數派發消息,觸發窗口處理函數,調用窗口處理函數。
- msg.hWnd --> 找到保存窗口數據的內存 ---> 比對"窗口名稱"--->匹配窗口類 ---> 調用WndProc(msg.hWnd, msg.message, msg,wParam, msg.lParam); --->給了我們處理消息的機會,我們只處理我們關註的消息,其余的消息,讓系統默認的函數DefWindowProc()處理。
Win32API 消息機制