訊息系統是 Win32 程式運行的核心動力。一個訊息本質上是一個 32 位元值,唯一標識一個事件,通知應用程式發生了特定事情——如滑鼠點擊、視窗縮放、鍵盤輸入等。Windows 將訊息封裝在 MSG 結構中傳遞給應用程式,包含訊息類型與相關資訊(如滑鼠座標)。
typedef struct tagMsg {
HWND hwnd; // 接收訊息的視窗控制代碼
UINT message; // 訊息常數識別碼(訊息號)
WPARAM wParam; // 32 位元附加資訊,含義視訊息而定
LPARAM lParam; // 32 位元附加資訊,含義視訊息而定
DWORD time; // 訊息建立時間
POINT pt; // 訊息建立時滑鼠/游標螢幕座標
} MSG;
hwnd:32 位元視窗控制代碼,Win32 為多數可視物件維護控制代碼(視窗、對話框、按鈕、編輯框等)。message:區分訊息的常數值,包含 Windows 預定義常數與自訂常數。視窗程序依此決定處理方式,如 WM_PAINT 通知客戶區需重繪。符號常數前綴標示處理該類訊息的視窗類型。wParam:通常為與訊息相關的常數值,或視窗/控制項控制代碼。lParam:通常為指向記憶體資料的指標。因 WPARAM、LPARAM 與指標皆為 32 位元,三者可互相轉換。0x0000 ~ 0x03FF (WM_USER-1),應用程式不可使用。WM_USER (0x0400) ~ 0x7FFF,供程式內部使用。0xC000 ~ 0xFFFF,用於應用程式間通訊。具體範例:WM_NULL (0x0000) 空訊息;0x0001~0x0087 視窗訊息;0x0100~0x0108 鍵盤訊息;0x0200~0x020A 滑鼠訊息;WM_USER (0x0400)、WM_APP (0x8000) 等。
最常見,由作業系統與控制其他視窗的視窗使用。如 CreateWindow、DestroyWindow、MoveWindow 及滑鼠點擊皆屬此類。
特殊視窗訊息,處理從一個視窗傳送到另一視窗的使用者請求。例如按下按鈕會向主視窗發送命令訊息。處理範圍廣泛,不限視窗類,文件類、文件範本類、應用程式類皆可處理。
子控制項發生事件需通知父視窗。僅適用標準控制項(按鈕、清單方塊、編輯框等)及通用控制項(樹狀檢視、清單檢視等)。類似命令訊息但非為處理使用者命令,而是讓主視窗能改變控制項(如載入、顯示資料)。
BN_CLICKED:使用者單擊按鈕BN_DISABLE:按鈕被禁用BN_DOUBLECLICKED:使用者雙擊按鈕BN_HILITE:使用者高亮按鈕BN_PAINT:按鈕需重繪BN_UNHILITE:移除高亮CBN_CLOSEUP:清單方塊關閉CBN_DBLCLK:使用者雙擊字串CBN_DROPDOWN:清單方塊展開CBN_EDITCHANGE:使用者修改編輯框文字CBN_EDITUPDATE:編輯框文字即將更新CBN_ERRSPACE:記憶體不足CBN_KILLFOCUS:失去輸入焦點CBN_SELCHANGE:選擇項目變更CBN_SELENDCANCEL:取消選擇CBN_SELENDOK:確認選擇CBN_SETFOCUS:獲得輸入焦點EN_CHANGE:文字已更新EN_ERRSPACE:記憶體不足EN_HSCROLL:點擊水平捲軸EN_KILLFOCUS:正在失去焦點EN_MAXTEXT:插入內容被截斷EN_SETFOCUS:獲得輸入焦點EN_UPDATE:文字將要更新EN_VSCROLL:點擊垂直捲軸LBN_DBLCLK:使用者雙擊項目LBN_ERRSPACE:記憶體不足LBN_KILLFOCUS:正在失去焦點LBN_SELCANCEL:選擇被取消LBN_SELCHANGE:選擇了另一項目LBN_SETFOCUS:獲得輸入焦點(未完待續...)