1. 程式人生 > >Win32API 消息機制

Win32API 消息機制

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 消息機制