//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef KEYBOARD_H #define KEYBOARD_H #ifdef _WIN32 #pragma once #endif #define KEY_MOD_SHIFT 0x0001 #define KEY_MOD_CONTROL 0x0002 #define KEY_MOD_ALT 0x0004 // // Defines the maximum number of physical keys. These physical keys correspond to // the windows virtual key codes shown below. Missing key codes may be up for grabs, // but it is probably safer to add to the end of the list. // #define MAX_PHYSICAL_KEYS 256 // // VK_LBUTTON 0x01 // VK_RBUTTON 0x02 // VK_CANCEL 0x03 // VK_MBUTTON 0x04 // ? 0x04 // ? 0x05 // ? 0x06 // ? 0x07 // VK_BACK 0x08 // VK_TAB 0x09 // ? 0x0A // ? 0x0B // VK_CLEAR 0x0C // VK_RETURN 0x0D // ? 0x0E // ? 0x0F // VK_SHIFT 0x10 // VK_CONTROL 0x11 // VK_MENU 0x12 // VK_PAUSE 0x13 // VK_CAPITAL 0x14 // VK_KANA 0x15 // VK_HANGUL 0x15 // VK_JUNJA 0x17 // VK_FINAL 0x18 // VK_KANJI 0x19 // ? 0x1A // VK_ESCAPE 0x1B // VK_CONVERT 0x1C // VK_NONCONVERT 0x1D // VK_ACCEPT 0x1E // VK_MODECHANGE 0x1F // VK_SPACE 0x20 // VK_PRIOR 0x21 // VK_NEXT 0x22 // VK_END 0x23 // VK_HOME 0x24 // VK_LEFT 0x25 // VK_UP 0x26 // VK_RIGHT 0x27 // VK_DOWN 0x28 // VK_SELECT 0x29 // VK_PRINT 0x2A // VK_EXECUTE 0x2B // VK_SNAPSHOT 0x2C // VK_INSERT 0x2D // VK_DELETE 0x2E // VK_HELP 0x2F // // VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) // // VK_0 0x30 // VK_1 0x31 // VK_2 0x32 // VK_3 0x33 // VK_4 0x34 // VK_5 0x35 // VK_6 0x36 // VK_7 0x37 // VK_8 0x38 // VK_9 0x39 // ? 0x40 // // VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) // // VK_A 0X41 // VK_B 0X42 // VK_C 0X43 // VK_D 0X44 // VK_E 0X45 // VK_F 0X46 // VK_G 0X47 // VK_H 0X48 // VK_I 0X49 // VK_J 0X4A // VK_K 0X4B // VK_L 0X4C // VK_M 0X4D // VK_N 0X4E // VK_O 0X4F // VK_P 0X50 // VK_Q 0X51 // VK_R 0X52 // VK_S 0X53 // VK_T 0X54 // VK_U 0X55 // VK_V 0X56 // VK_W 0X57 // VK_X 0X58 // VK_Y 0X59 // VK_Z 0X5A // VK_LWIN 0x5B // VK_RWIN 0x5C // VK_APPS 0x5D // ? 0x5E // ? 0x5F // VK_NUMPAD0 0x60 // VK_NUMPAD1 0x61 // VK_NUMPAD2 0x62 // VK_NUMPAD3 0x63 // VK_NUMPAD4 0x64 // VK_NUMPAD5 0x65 // VK_NUMPAD6 0x66 // VK_NUMPAD7 0x67 // VK_NUMPAD8 0x68 // VK_NUMPAD9 0x69 // VK_MULTIPLY 0x6A // VK_ADD 0x6B // VK_SEPARATOR 0x6C // VK_SUBTRACT 0x6D // VK_DECIMAL 0x6E // VK_DIVIDE 0x6F // // Function keys // // VK_F1 0x70 // VK_F2 0x71 // VK_F3 0x72 // VK_F4 0x73 // VK_F5 0x74 // VK_F6 0x75 // VK_F7 0x76 // VK_F8 0x77 // VK_F9 0x78 // VK_F10 0x79 // VK_F11 0x7A // VK_F12 0x7B // VK_F13 0x7C // VK_F14 0x7D // VK_F15 0x7E // VK_F16 0x7F // VK_F17 0x80 // VK_F18 0x81 // VK_F19 0x82 // VK_F20 0x83 // VK_F21 0x84 // VK_F22 0x85 // VK_F23 0x86 // VK_F24 0x87 // ? 0x88 // ? 0x89 // ? 0x8A // ? 0x8B // ? 0x8C // ? 0x8D // ? 0x8E // ? 0x8F // VK_NUMLOCK 0x90 // VK_SCROLL 0x91 // ? 0x92 // ? 0x93 // ? 0x94 // ? 0x95 // ? 0x96 // ? 0x97 // ? 0x98 // ? 0x99 // ? 0x9A // ? 0x9B // ? 0x9C // ? 0x9D // ? 0x9E // ? 0x9F // // VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys. // Used only as parameters to GetAsyncKeyState() and GetKeyState(). // No other API or message will distinguish left and right keys in this way. // // VK_LSHIFT 0xA0 // VK_RSHIFT 0xA1 // VK_LCONTROL 0xA2 // VK_RCONTROL 0xA3 // VK_LMENU 0xA4 // VK_RMENU 0xA5 // VK_PROCESSKEY 0xE5 // VK_ATTN 0xF6 // VK_CRSEL 0xF7 // VK_EXSEL 0xF8 // VK_EREOF 0xF9 // VK_PLAY 0xFA // VK_ZOOM 0xFB // VK_NONAME 0xFC // VK_PA1 0xFD // VK_OEM_CLEAR 0xFE // // // Defines the maximum number of logical keys. Logical keys are application-specific // values that are associated with physical keys via AddKeyMap. // #define MAX_LOGICAL_KEYS 256 // // Defines the maximum number of unique key bindings. // #define MAX_KEYMAPS 256 typedef struct { unsigned int uChar; unsigned int uModifierKeys; unsigned int uLogicalKey; } KeyMap_t; class CKeyboard { public: CKeyboard(void); ~CKeyboard(void); void AddKeyMap(unsigned int uChar, unsigned int uModifierKeys, unsigned int uLogicalKey); void ClearImpulseFlags(void); void ClearKeyStates(void); float GetKeyScale(unsigned int uLogicalKey); void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); void RemoveAllKeyMaps(void); protected: bool IsKeyPressed(unsigned int uChar, unsigned int uModifierKeys); bool IsModifierKey(unsigned int uChar); unsigned int GetModifierKeyBit(unsigned int uChar); void UpdateLogicalKeys(unsigned int uChar, bool bPressed); unsigned int g_uPhysicalKeyState[MAX_PHYSICAL_KEYS]; unsigned int g_uLogicalKeyState[MAX_LOGICAL_KEYS]; KeyMap_t g_uKeyMap[MAX_KEYMAPS]; unsigned int g_uKeyMaps; }; #endif // KEYBOARD_H