首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ 視窗程序 wParam 與 lParam 詳細解析:以 WM_KEYDOWN 為例

     編輯:程式設計綜合問答

Windows 視窗程序 WndProc(HWND, UINT, WPARAM, LPARAM) 中的 wParam 與 lParam 並非固定含義,而是隨訊息類型而異。本文以 WM_KEYDOWN 為例,示範如何查閱 MSDN 官方文件、解析每個位元含義,並提供通用查詢方法,助你不再死記硬背。

核心觀念:參數含義隨訊息而定

  • wParam(Word Parameter,32 位):通常放較小的整數值,如虛擬鍵碼、控制項 ID。
  • lParam(Long Parameter,32 位):通常放較大或複雜資料,如座標、位元旗標組合、指標。
  • 同一參數在不同訊息代表完全不同意義,必須查閱該訊息的專屬文件。

實戰:查詢 WM_KEYDOWN 參數定義

  1. 打開瀏覽器,搜尋 WM_KEYDOWN MSDN,點擊第一個結果(learn.microsoft.com 或舊版 msdn.microsoft.com)。
  2. 找到 Parameters 區塊:
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...

詳細位元拆解(lParam)

位元名稱說明
0-15Repeat Count鍵盤自動重複觸發次數
16-23Scan Code硬體掃描碼,視鍵盤硬體而定
24Extended Key1 = 擴展鍵(如右 Alt、右 Ctrl、數字鍵盤 Enter)
25-28Reserved保留,勿用
29Context Code1 = ALT 鍵同時被按下
30Previous Key State1 = 訊息發送前鍵已按下(長按觸發)
31Transition State0 = 按下,1 = 釋放(WM_KEYDOWN 恆為 0)

通用查詢四步法(適用所有訊息)

  1. 搜尋 <MessageName> MSDN(如 WM_MOUSEMOVE MSDN)。
  2. 開啟官方文件,直奔 Parameters 區塊。
  3. 閱讀 wParam、lParam 的逐欄說明。
  4. 若有位元級定義,繪製位元表或查找 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)的參數表整理成個人速查表,開發效率倍增。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved