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

VC++ WM_CHAR 消息處理:區分字符與虛擬鍵碼

     編輯:程式設計綜合問答

核心誤區

嘗試在 `WM_CHAR` 中用 `VK_XXX` 虛擬鍵碼判斷按鍵:

switch(wParam) {
    case VK_XXX: // 錯誤!WM_CHAR 不包含虛擬鍵碼
        break;
}

WM_CHAR vs WM_KEYDOWN

消息wParam 含義適用場景
WM_CHAR字符碼(ASCII/Unicode)文本輸入、字符處理
WM_KEYDOWN虛擬鍵碼(VK_XXX)功能鍵、組合鍵、遊戲控制
WM_KEYUP虛擬鍵碼鍵釋放檢測

正確處理字符輸入

case WM_CHAR:
    TCHAR ch = (TCHAR)wParam;
    if (ch >= _T('0') && ch <= _T('9')) {
        // 處理數字輸入
    } else if (ch == _T('\r')) {
        // 回車鍵
    } else if (ch == _T('\b')) {
        // 退格鍵
    }
    break;

正確處理虛擬鍵(如方向鍵、F1-F12)

case WM_KEYDOWN:
    switch (wParam) {
        case VK_LEFT:  // 左方向鍵
        case VK_RIGHT: // 右方向鍵
        case VK_F1:    // F1 鍵
        case VK_CONTROL: // Ctrl 鍵
            // 處理功能鍵
            break;
    }
    break;

鍵盤消息傳遞順序

  1. 按下鍵 → `WM_KEYDOWN`(虛擬鍵碼)
  2. 若產生字符 → `WM_CHAR`(字符碼)
  3. 釋放鍵 → `WM_KEYUP`(虛擬鍵碼)

擴展:鍵盤狀態檢測

// 判斷組合鍵
if (GetAsyncKeyState(VK_CONTROL) & 0x8000) {
    // Ctrl 被按住
}
if (GetKeyState(VK_SHIFT) & 0x8000) {
    // Shift 被按住
}

總結

  • WM_CHAR 對應字符,非按鍵——用於文本編輯
  • WM_KEYDOWN/UP 對應虛擬鍵碼——用於功能鍵、遊戲、快捷鍵
  • 切勿在 `WM_CHAR` 中使用 `VK_XXX` 常量
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved