虛擬鍵碼 (Virtual-Key Codes) 完整對照表
| 符號常數 | 十六進制 | 對應按鍵 |
| VK_LBUTTON | 0x01 | 滑鼠左鍵 |
| VK_RBUTTON | 0x02 | 滑鼠右鍵 |
| VK_CANCEL | 0x03 | Ctrl+Break |
| VK_MBUTTON | 0x04 | 滑鼠中鍵 |
| VK_BACK | 0x08 | Backspace |
| VK_TAB | 0x09 | Tab |
| VK_CLEAR | 0x0C | Clear |
| VK_RETURN | 0x0D | Enter |
| VK_SHIFT | 0x10 | Shift |
| VK_CONTROL | 0x11 | Ctrl |
| VK_MENU | 0x12 | Alt |
| VK_PAUSE | 0x13 | Pause |
| VK_CAPITAL | 0x14 | Caps Lock |
| VK_ESCAPE | 0x1B | Esc |
| VK_SPACE | 0x20 | Spacebar |
| VK_PRIOR | 0x21 | Page Up |
| VK_NEXT | 0x22 | Page Down |
| VK_END | 0x23 | End |
| VK_HOME | 0x24 | Home |
| VK_LEFT | 0x25 | ← |
| VK_UP | 0x26 | ↑ |
| VK_RIGHT | 0x27 | → |
| VK_DOWN | 0x28 | ↓ |
| VK_SELECT | 0x29 | Select |
| VK_EXECUTE | 0x2B | Execute |
| VK_SNAPSHOT | 0x2C | Print Screen |
| VK_INSERT | 0x2D | Insert |
| VK_DELETE | 0x2E | Delete |
| VK_HELP | 0x2F | Help |
| 字母鍵 (A-Z) 與數字鍵 (0-9) 直接用字元常數:'A' ~ 'Z', '0' ~ '9' |
| VK_LWIN | 0x5B | 左 Win 鍵 |
| VK_RWIN | 0x5C | 右 Win 鍵 |
| VK_APPS | 0x5D | 應用程式鍵 (選單鍵) |
| VK_NUMPAD0 | 0x60 | 小鍵盤 0 |
| VK_NUMPAD1 | 0x61 | 小鍵盤 1 |
| VK_NUMPAD2 | 0x62 | 小鍵盤 2 |
| VK_NUMPAD3 | 0x63 | 小鍵盤 3 |
| VK_NUMPAD4 | 0x64 | 小鍵盤 4 |
| VK_NUMPAD5 | 0x65 | 小鍵盤 5 |
| VK_NUMPAD6 | 0x66 | 小鍵盤 6 |
| VK_NUMPAD7 | 0x67 | 小鍵盤 7 |
| VK_NUMPAD8 | 0x68 | 小鍵盤 8 |
| VK_NUMPAD9 | 0x69 | 小鍵盤 9 |
| VK_MULTIPLY | 0x6A | 小鍵盤 * |
| VK_ADD | 0x6B | 小鍵盤 + |
| VK_SEPARATOR | 0x6C | 小鍵盤 分隔符 |
| VK_SUBTRACT | 0x6D | 小鍵盤 - |
| VK_DECIMAL | 0x6E | 小鍵盤 . |
| VK_DIVIDE | 0x6F | 小鍵盤 / |
| VK_F1 | 0x70 | F1 |
| VK_F2 | 0x71 | F2 |
| VK_F3 | 0x72 | F3 |
| VK_F4 | 0x73 | F4 |
| VK_F5 | 0x74 | F5 |
| VK_F6 | 0x75 | F6 |
| VK_F7 | 0x76 | F7 |
| VK_F8 | 0x77 | F8 |
| VK_F9 | 0x78 | F9 |
| VK_F10 | 0x79 | F10 |
| VK_F11 | 0x7A | F11 |
| VK_F12 | 0x7B | F12 |
| VK_F13 | 0x7C | F13 |
| VK_F14 | 0x7D | F14 |
| VK_F15 | 0x7E | F15 |
| VK_F16 | 0x7F | F16 |
| VK_F17 | 0x80 | F17 |
| VK_F18 | 0x81 | F18 |
| VK_F19 | 0x82 | F19 |
| VK_F20 | 0x83 | F20 |
| VK_F21 | 0x84 | F21 |
| VK_F22 | 0x85 | F22 |
| VK_F23 | 0x86 | F23 |
| VK_F24 | 0x87 | F24 |
| VK_NUMLOCK | 0x90 | Num Lock |
| VK_SCROLL | 0x91 | Scroll Lock |
| VK_ATTN | 0xF6 | Attn |
| VK_CRSEL | 0xF7 | CrSel |
| VK_EXSEL | 0xF8 | ExSel |
| VK_EREOF | 0xF9 | Erase EOF |
| VK_PLAY | 0xFA | Play |
| VK_ZOOM | 0xFB | Zoom |
| VK_OEM_CLEAR | 0xFE | Clear |
鍵盤訊息處理範例
範例 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 輪詢而非訊息驅動