Windows 訊息機制概述
訊息是 Windows 通知應用程式發生事件的機制。每個訊息以 MSG (或 TMsg) 結構傳遞:
typedef struct tagMSG {
HWND hwnd; // 視窗控制代碼
UINT message; // 訊息常數識別碼
WPARAM wParam; // 32 位元附加資訊
LPARAM lParam; // 32 位元附加資訊
DWORD time; // 訊息建立時間
POINT pt; // 滑鼠位置
} MSG;
訊息常數完整列表 (十六進位值)
視窗管理 (0x0000 - 0x00FF)
| 常數 | 值 | 說明 |
| WM_NULL | 0x0000 | 空訊息,常用於 SendMessageTimeout 偵測掛住 |
| WM_CREATE | 0x0001 | 視窗建立 |
| WM_DESTROY | 0x0002 | 視窗銷毀 |
| WM_MOVE | 0x0003 | 視窗移動 |
| WM_SIZE | 0x0005 | 視窗大小改變 |
| WM_ACTIVATE | 0x0006 | 視窗啟動/失去啟動 |
| WM_SETFOCUS | 0x0007 | 獲得鍵盤焦點 |
| WM_KILLFOCUS | 0x0008 | 失去鍵盤焦點 |
| WM_ENABLE | 0x000A | 啟用/停用狀態改變 |
| WM_SETREDRAW | 0x000B | 設定是否重繪 |
| WM_SETTEXT | 0x000C | 設定視窗文字 |
| WM_GETTEXT | 0x000D | 取得視窗文字 |
| WM_GETTEXTLENGTH | 0x000E | 取得文字長度 |
| WM_PAINT | 0x000F | 要求重繪用戶區 |
| WM_CLOSE | 0x0010 | 關閉視窗/應用程式 |
| WM_QUERYENDSESSION | 0x0011 | 查詢是否允許結束工作階段 |
| WM_QUIT | 0x0012 | 結束程式 (PostQuitMessage) |
| WM_QUERYOPEN | 0x0013 | 圖示還原查詢 |
| WM_ERASEBKGND | 0x0014 | 擦除背景 |
| WM_SYSCOLORCHANGE | 0x0015 | 系統色彩改變 |
| WM_ENDSESSION | 0x0016 | 工作階段結束通知 |
| WM_SHOWWINDOW | 0x0018 | 視窗顯示/隱藏 |
| WM_ACTIVATEAPP | 0x001C | 應用程式啟動/失去啟動 |
| WM_FONTCHANGE | 0x001D | 字型資源變更 |
| WM_TIMECHANGE | 0x001E | 系統時間變更 |
| WM_CANCELMODE | 0x001F | 取消模態操作 |
非用戶區與滑鼠 (0x0080 - 0x020F)
| 常數 | 值 | 說明 |
| WM_NCCREATE | 0x0081 | 非用戶區建立 (WM_CREATE 前) |
| WM_NCDESTROY | 0x0082 | 非用戶區銷毀 |
| WM_NCCALCSIZE | 0x0083 | 計算用戶區大小/位置 |
| WM_NCHITTEST | 0x0084 | 滑鼠移動/按下/釋放時測試位置 (回傳 HTCAPTION 等) |
| WM_NCPAINT | 0x0085 | 繪製非用戶區 (標題列、邊框) |
| WM_NCACTIVATE | 0x0086 | 非用戶區啟動狀態改變 |
| WM_GETDLGCODE | 0x0087 | 對話框控制項鍵盤導航代碼 |
| WM_NCMOUSEMOVE | 0x00A0 | 非用戶區滑鼠移動 |
| WM_NCLBUTTONDOWN | 0x00A1 | 非用戶區左鍵按下 |
| WM_NCLBUTTONUP | 0x00A2 | 非用戶區左鍵釋放 |
| WM_NCLBUTTONDBLCLK | 0x00A3 | 非用戶區左鍵雙擊 |
| WM_NCRBUTTONDOWN | 0x00A4 | 非用戶區右鍵按下 |
| WM_NCRBUTTONUP | 0x00A5 | 非用戶區右鍵釋放 |
| WM_NCRBUTTONDBLCLK | 0x00A6 | 非用戶區右鍵雙擊 |
| WM_NCMBUTTONDOWN | 0x00A7 | 非用戶區中鍵按下 |
| WM_NCMBUTTONUP | 0x00A8 | 非用戶區中鍵釋放 |
| WM_NCMBUTTONDBLCLK | 0x00A9 | 非用戶區中鍵雙擊 |
| WM_MOUSEFIRST | 0x0200 | 滑鼠訊息起始 |
| WM_MOUSEMOVE | 0x0200 | 滑鼠移動 |
| WM_LBUTTONDOWN | 0x0201 | 左鍵按下 |
| WM_LBUTTONUP | 0x0202 | 左鍵釋放 |
| WM_LBUTTONDBLCLK | 0x0203 | 左鍵雙擊 |
| WM_RBUTTONDOWN | 0x0204 | 右鍵按下 |
| WM_RBUTTONUP | 0x0205 | 右鍵釋放 |
| WM_RBUTTONDBLCLK | 0x0206 | 右鍵雙擊 |
| WM_MBUTTONDOWN | 0x0207 | 中鍵按下 |
| WM_MBUTTONUP | 0x0208 | 中鍵釋放 |
| WM_MBUTTONDBLCLK | 0x0209 | 中鍵雙擊 |
| WM_MOUSEWHEEL | 0x020A | 滑鼠滾輪 |
| WM_MOUSELAST | 0x020A | 滑鼠訊息結束 |
鍵盤與系統按鍵 (0x0100 - 0x010F)
| 常數 | 值 | 說明 |
| WM_KEYDOWN | 0x0100 | 按下鍵 |
| WM_KEYUP | 0x0101 | 釋放鍵 |
| WM_CHAR | 0x0102 | 字元輸入 (經 TranslateMessage) |
| WM_DEADCHAR | 0x0103 | 無效字元 (拼音鍵等) |
| WM_SYSKEYDOWN | 0x0104 | Alt+鍵 組合 |
| WM_SYSKEYUP | 0x0105 | Alt+鍵 釋放 |
| WM_SYSCHAR | 0x0106 | Alt+字元 |
| WM_SYSDEADCHAR | 0x0107 | Alt+無效字元 |
選單、捲軸、計時器、對話框 (0x0110 - 0x0138)
| 常數 | 值 | 說明 |
| WM_INITDIALOG | 0x0110 | 對話框初始化 |
| WM_COMMAND | 0x0111 | 選單/控制項/快速鍵命令 |
| WM_SYSCOMMAND | 0x0112 | 系統選單命令 (最大化/最小化/關閉等) |
| WM_TIMER | 0x0113 | 計時器事件 |
| WM_HSCROLL | 0x0114 | 水平捲軸事件 |
| WM_VSCROLL | 0x0115 | 垂直捲軸事件 |
| WM_INITMENU | 0x0116 | 選單即將啟動 |
| WM_INITMENUPOPUP | 0x0117 | 彈出選單即將啟動 |
| WM_MENUSELECT | 0x011F | 選單項目選取 |
| WM_MENUCHAR | 0x0120 | 選單啟動時按鍵 |
| WM_ENTERIDLE | 0x0121 | 模態對話框/選單進入閒置 |
| WM_CTLCOLORMSGBOX | 0x0132 | 訊息方塊繪製前設定色彩 |
| WM_CTLCOLOREDIT | 0x0133 | 編輯控制項繪製前設定色彩 |
| WM_CTLCOLORLISTBOX | 0x0134 | 清單方塊繪製前設定色彩 |
| WM_CTLCOLORBTN | 0x0135 | 按鈕繪製前設定色彩 |
| WM_CTLCOLORDLG | 0x0136 | 對話框繪製前設定色彩 |
| WM_CTLCOLORSCROLLBAR | 0x0137 | 捲軸繪製前設定色彩 |
| WM_CTLCOLORSTATIC | 0x0138 | 靜態控制項繪製前設定色彩 |
剪貼板、調色板、DDE、應用程式自訂 (0x0300 - 0x8000+)
| 常數 | 值 | 說明 |
| WM_CUT | 0x0300 | 剪下 |
| WM_COPY | 0x0301 | 複製 |
| WM_PASTE | 0x0302 | 貼上 |
| WM_CLEAR | 0x0303 | 清除 |
| WM_UNDO | 0x0304 | 復原 |
| WM_DESTROYCLIPBOARD | 0x0307 | 清空剪貼板 |
| WM_DRAWCLIPBOARD | 0x0308 | 剪貼板內容變更 |
| WM_PAINTCLIPBOARD | 0x0309 | 繪製剪貼板內容 |
| WM_QUERYNEWPALETTE | 0x030F | 實現邏輯調色板 |
| WM_PALETTECHANGED | 0x0311 | 調色板已改變 |
| WM_HOTKEY | 0x0312 | 熱鍵觸發 (RegisterHotKey) |
| WM_DDE_INITIATE | 0x03E0 | DDE 會話啟動 |
| WM_DDE_TERMINATE | 0x03E1 | DDE 會話結束 |
| WM_DDE_ADVISE | 0x03E2 | DDE 請求通知 |
| WM_DDE_UNADVISE | 0x03E3 | DDE 取消通知 |
| WM_DDE_ACK | 0x03E4 | DDE 確認 |
| WM_DDE_DATA | 0x03E5 | DDE 資料傳遞 |
| WM_DDE_REQUEST | 0x03E6 | DDE 請求資料 |
| WM_DDE_POKE | 0x03E7 | DDE 未請求資料 |
| WM_DDE_EXECUTE | 0x03E8 | DDE 執行命令 |
| WM_USER | 0x0400 | 應用程式自訂訊息起始 |
| WM_APP | 0x8000 | 應用程式自訂訊息起始 (不易衝突) |
控制項通知訊息 (WM_COMMAND 高字/WM_NOTIFY)
按鈕 (BN_*)
- BN_CLICKED, BN_DISABLE, BN_DOUBLECLICKED, BN_HILITE, BN_PAINT, BN_UNHILITE
下拉方塊 (CBN_*)
- CBN_CLOSEUP, CBN_DBLCLK, CBN_DROPDOWN, CBN_EDITCHANGE, CBN_EDITUPDATE, CBN_ERRSPACE, CBN_KILLFOCUS, CBN_SELCHANGE, CBN_SELENDCANCEL, CBN_SELENDOK, CBN_SETFOCUS
編輯控制項 (EN_*)
- EN_CHANGE, EN_ERRSPACE, EN_HSCROLL, EN_KILLFOCUS, EN_MAXTEXT, EN_SETFOCUS, EN_UPDATE, EN_VSCROLL
清單方塊 (LBN_*)
- LBN_DBLCLK, LBN_ERRSPACE, LBN_KILLFOCUS, LBN_SELCANCEL, LBN_SELCHANGE, LBN_SETFOCUS
詳細參數與 wParam/lParam 含義請參考 MSDN《Windows Messages》對應項目。