Windows 視窗程序 WndProc(HWND, UINT, WPARAM, LPARAM) 中的 wParam 與 lParam 並非固定含義,而是隨訊息類型而異。本文以 WM_KEYDOWN 為例,示範如何查閱 MSDN 官方文件、解析每個位元含義,並提供通用查詢方法,助你不再死記硬背。
wParam(Word Parameter,32 位):通常放較小的整數值,如虛擬鍵碼、控制項 ID。lParam(Long Parameter,32 位):通常放較大或複雜資料,如座標、位元旗標組合、指標。WM_KEYDOWN MSDN,點擊第一個結果(learn.microsoft.com 或舊版 msdn.microsoft.com)。wParam
The virtual-key code of the nonsystem key. See Virtual-Key Codes.
lParam
The repeat count, scan code, extended-key flag, context code,
previous key-state flag, and transition-state flag...
| 位元 | 名稱 | 說明 |
|---|---|---|
| 0-15 | Repeat Count | 鍵盤自動重複觸發次數 |
| 16-23 | Scan Code | 硬體掃描碼,視鍵盤硬體而定 |
| 24 | Extended Key | 1 = 擴展鍵(如右 Alt、右 Ctrl、數字鍵盤 Enter) |
| 25-28 | Reserved | 保留,勿用 |
| 29 | Context Code | 1 = ALT 鍵同時被按下 |
| 30 | Previous Key State | 1 = 訊息發送前鍵已按下(長按觸發) |
| 31 | Transition State | 0 = 按下,1 = 釋放(WM_KEYDOWN 恆為 0) |
<MessageName> MSDN(如 WM_MOUSEMOVE MSDN)。wParam、lParam 的逐欄說明。GET_X_LPARAM、HIWORD 等巨集輔助提取。// 從 lParam 取得滑鼠座標
int x = GET_X_LPARAM(lParam); // 低序位字
int y = GET_Y_LPARAM(lParam); // 高序位字
// 從 wParam 取得鍵盤虛擬鍵碼
int vkCode = (int)wParam;
// 判斷是否為擴展鍵
BOOL isExtended = (lParam >> 24) & 0x01;
不需死記 wParam/lParam 在每個訊息的含義,掌握「查 MSDN 文件 → 看 Parameters → 畫位元表」的標準流程,即可應對所有 Windows 訊息。建議將常用訊息(WM_KEYDOWN, WM_MOUSEMOVE, WM_COMMAND, WM_NOTIFY)的參數表整理成個人速查表,開發效率倍增。