首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 虛擬鍵碼完整對照表與鍵盤訊息處理範例

     編輯:VC++

虛擬鍵碼 (Virtual-Key Codes) 完整對照表

符號常數十六進制對應按鍵
VK_LBUTTON0x01滑鼠左鍵
VK_RBUTTON0x02滑鼠右鍵
VK_CANCEL0x03Ctrl+Break
VK_MBUTTON0x04滑鼠中鍵
VK_BACK0x08Backspace
VK_TAB0x09Tab
VK_CLEAR0x0CClear
VK_RETURN0x0DEnter
VK_SHIFT0x10Shift
VK_CONTROL0x11Ctrl
VK_MENU0x12Alt
VK_PAUSE0x13Pause
VK_CAPITAL0x14Caps Lock
VK_ESCAPE0x1BEsc
VK_SPACE0x20Spacebar
VK_PRIOR0x21Page Up
VK_NEXT0x22Page Down
VK_END0x23End
VK_HOME0x24Home
VK_LEFT0x25←
VK_UP0x26↑
VK_RIGHT0x27→
VK_DOWN0x28↓
VK_SELECT0x29Select
VK_EXECUTE0x2BExecute
VK_SNAPSHOT0x2CPrint Screen
VK_INSERT0x2DInsert
VK_DELETE0x2EDelete
VK_HELP0x2FHelp
字母鍵 (A-Z) 與數字鍵 (0-9) 直接用字元常數:'A' ~ 'Z', '0' ~ '9'
VK_LWIN0x5B左 Win 鍵
VK_RWIN0x5C右 Win 鍵
VK_APPS0x5D應用程式鍵 (選單鍵)
VK_NUMPAD00x60小鍵盤 0
VK_NUMPAD10x61小鍵盤 1
VK_NUMPAD20x62小鍵盤 2
VK_NUMPAD30x63小鍵盤 3
VK_NUMPAD40x64小鍵盤 4
VK_NUMPAD50x65小鍵盤 5
VK_NUMPAD60x66小鍵盤 6
VK_NUMPAD70x67小鍵盤 7
VK_NUMPAD80x68小鍵盤 8
VK_NUMPAD90x69小鍵盤 9
VK_MULTIPLY0x6A小鍵盤 *
VK_ADD0x6B小鍵盤 +
VK_SEPARATOR0x6C小鍵盤 分隔符
VK_SUBTRACT0x6D小鍵盤 -
VK_DECIMAL0x6E小鍵盤 .
VK_DIVIDE0x6F小鍵盤 /
VK_F10x70F1
VK_F20x71F2
VK_F30x72F3
VK_F40x73F4
VK_F50x74F5
VK_F60x75F6
VK_F70x76F7
VK_F80x77F8
VK_F90x78F9
VK_F100x79F10
VK_F110x7AF11
VK_F120x7BF12
VK_F130x7CF13
VK_F140x7DF14
VK_F150x7EF15
VK_F160x7FF16
VK_F170x80F17
VK_F180x81F18
VK_F190x82F19
VK_F200x83F20
VK_F210x84F21
VK_F220x85F22
VK_F230x86F23
VK_F240x87F24
VK_NUMLOCK0x90Num Lock
VK_SCROLL0x91Scroll Lock
VK_ATTN0xF6Attn
VK_CRSEL0xF7CrSel
VK_EXSEL0xF8ExSel
VK_EREOF0xF9Erase EOF
VK_PLAY0xFAPlay
VK_ZOOM0xFBZoom
VK_OEM_CLEAR0xFEClear

鍵盤訊息處理範例

範例 1:單一按鍵響應 (在 PreTranslateMessage 中)

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        if (pMsg->wParam == 'M')           // 字母鍵直接用字元
            MessageBox(_T("按下了 M 鍵"));
        else if (pMsg->wParam == VK_NUMPAD1) // 小鍵盤用虛擬鍵碼
            MessageBox(_T("按下了小鍵盤 1"));
    }
    return CDialog::PreTranslateMessage(pMsg);
}

範例 2:組合鍵偵測 (Ctrl + X)

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        switch (pMsg->wParam)
        {
        case VK_ESCAPE:
            SetFocus(); return TRUE;
        case 'X':
            if (GetKeyState(VK_CONTROL) < 0) // 高位元為 1 表示按下
                MessageBox(_T("Ctrl+X 被觸發"));
            return TRUE;
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

關鍵 API:GetKeyState

SHORT GetKeyState(int nVirtKey);
// 回傳值高位元 (bit 15) = 1 表示鍵盤按下
// 低位元 = 1 表示切換鍵 (Caps/Num/Scroll) 狀態為開啟

// 判斷 Shift/Ctrl/Alt 是否按下:
if (GetKeyState(VK_SHIFT)   < 0) { /* Shift 按下 */ }
if (GetKeyState(VK_CONTROL) < 0) { /* Ctrl 按下 */ }
if (GetKeyState(VK_MENU)    < 0) { /* Alt 按下 */ }

注意事項

  • PreTranslateMessage 可攔截對話框所有按鍵訊息,含焦點在子控制項時
  • 字母鍵不分大小寫,'A' ~ 'Z' 對應 0x41 ~ 0x5A
  • 組合鍵判斷需在目標鍵的 WM_KEYDOWN 中檢查修飾鍵狀態
  • 遊戲/即時應用建議用 GetAsyncKeyState 輪詢而非訊息驅動
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved