TMsg (對應 Win32 MSG)
type
TMsg = packed record
hwnd: HWND; // 目標視窗句柄
message: UINT; // 訊息識別碼 (WM_*)
wParam: WPARAM; // 32 位參數 1 (視訊息而定)
lParam: LPARAM; // 32 位參數 2 (視訊息而定)
time: DWORD; // 訊息投遞時間 (GetMessageTime)
pt: TPoint; // 滑鼠螢幕座標 (GetMessagePos)
end;
| 欄位 | 類型 | 含義 | 備註 |
|---|---|---|---|
| hwnd | HWND | 接收訊息的視窗句柄 | 所有可視物件 (視窗、按鈕、編輯框) 均有句柄 |
| message | UINT | 訊息類別常數 | 系統定義 (WM_*) 或自訂 (WM_USER+ / RegisterWindowMessage) |
| wParam | WPARAM | 參數 1 | 常為整數、旗標、控制項 ID、虛擬鍵碼 |
| lParam | LPARAM | 參數 2 | 常為指標、座標打包 (LOWORD/HIWORD)、結構指標 |
| time | DWORD | 訊息建立時間 (毫秒) | 系統啟動後經過毫秒數,GetMessageTime() 取得 |
| pt | TPoint | 滑鼠螢幕座標 | 訊息投遞時刻的游標位置,GetMessagePos() 取得 |
// 從 lParam 解析滑鼠座標
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
// 從 wParam/lParam 解析鍵盤狀態
#define GET_KEYSTATE_WPARAM(wp) ((wp) & 0xFFFF)
#define GET_REPEAT_COUNT(lp) ((lp) & 0xFFFF)
#define GET_SCAN_CODE(lp) ((lp >> 16) & 0xFF)
#define IS_EXTENDED_KEY(lp) ((lp >> 24) & 1)
#define WAS_KEY_DOWN(lp) ((lp >> 30) & 1)
| 常數 | 十六進位 | 觸發時機 |
|---|---|---|
| WM_NULL | $0000 | 空訊息,常用於測試視窗回應 |
| WM_CREATE | $0001 | 視窗建立 (CreateWindowEx 返回前) |
| WM_DESTROY | $0002 | 視窗銷毀 (DestroyWindow 後) |
| WM_MOVE | $0003 | 視窗移動 |
| WM_SIZE | $0005 | 視窗大小改變 (wParam: SIZE_MAXIMIZED/MINIMIZED/RESTORED) |
| WM_ACTIVATE | $0006 | 視窗啟用/失活 (LOWORD(wParam): WA_ACTIVE/INACTIVE/CLICKACTIVE) |
| WM_SETFOCUS | $0007 | 獲得鍵盤焦點 |
| WM_KILLFOCUS | $0008 | 失去鍵盤焦點 |
| WM_ENABLE | $000A | 啟用/停用視窗 |
| WM_SETREDRAW | $000B | 設定/清除重繪旗標 |
| WM_SETTEXT | $000C | 設定視窗文字 (標題/編輯框內容) |
| WM_GETTEXT | $000D | 取得視窗文字 |
| WM_GETTEXTLENGTH | $000E | 取得文字長度 |
| WM_PAINT | $000F | 請求繪製客戶區 |
| WM_CLOSE | $0010 | 關閉視窗請求 (可攔截取消) |
| WM_QUERYENDSESSION | $0011 | 系統詢問是否允許結束會話 |
| WM_QUIT | $0012 | PostQuitMessage 發送,結束訊息迴圈 |
| WM_QUERYOPEN | $0013 | 圖示化視窗請求還原 |
| WM_ERASEBKGND | $0014 | 擦除背景 (返回非零表示已處理) |
| WM_SYSCOLORCHANGE | $0015 | 系統顏色變更 |
| WM_SHOWWINDOW | $0018 | 視窗顯示/隱藏 (wParam: TRUE/FALSE) |
| WM_CTLCOLOR | $0019 | 控制項顏色請求 (舊版,建議用 WM_CTLCOLORBTN/STATIC/EDIT/LISTBOX/MSGBOX/SCROLLBAR) |
| WM_SETTINGCHANGE | $001A | 系統設定變更 (lParam 指向區域字串) |
| WM_DEVMODECHANGE | $001B | 裝置模式變更 |
| WM_ACTIVATEAPP | $001C | 應用程式啟用/切換 |
| WM_FONTCHANGE | $001D | 字體資源變更 |
| WM_TIMECHANGE | $001E | 系統時間變更 |
| WM_CANCELMODE | $001F | 取消模態狀態 (選單/拖放/捲軸) |
| WM_SETCURSOR | $0020 | 設定游標形狀 (滑鼠移入非客戶區/客戶區) |
| WM_MOUSEACTIVATE | $0021 | 非作用中視窗被滑鼠點擊 |
| WM_CHILDACTIVATE | $0022 | MDI 子視窗啟用/移動/大小變更 |
| WM_QUEUESYNC | $0023 | 佇列同步 (內部) |
| WM_GETMINMAXINFO | $0024 | 取得視窗最大/最小追蹤尺寸 (MINMAXINFO*) |
WM_USER (0x0400) 至 0x7FFF:視窗類別私有。WM_APP (0x8000) 至 0xBFFF:應用程式私有 (跨類別安全)。RegisterWindowMessage:系統全域唯一字串 → ID (0xC000~0xFFFF)。
這份表單是 Windows 程式開發的「字典」,遇到未知訊息先查表,再查 MSDN,最後才動手實驗。