37 using VirtualKeyToKeySymbolMap = std::map<uint16_t, vsg::KeySymbol>;
39 bool getKeySymbol(WPARAM wParam, LPARAM lParam, vsg::KeySymbol& keySymbol, vsg::KeySymbol& modifiedKeySymbol, vsg::KeyModifier& keyModifier)
41 uint16_t modifierMask = 0;
44 WORD vkCode = LOWORD(wParam);
45 WORD keyFlags = HIWORD(lParam);
46 WORD scanCode = LOBYTE(keyFlags);
47 BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED;
50 scanCode = MAKEWORD(scanCode, 0xE0);
52 uint32_t virtualKey = ::MapVirtualKeyEx(scanCode, MAPVK_VSC_TO_VK_EX, ::GetKeyboardLayout(0));
53 auto itr = _vk2vsg.find(virtualKey);
55 if (itr == _vk2vsg.end())
63 keySymbol = itr->second;
67 if (virtualKey == 0 || !::GetKeyboardState(keyState))
79 modifierMask |= vsg::KeyModifier::MODKEY_Shift;
84 modifierMask |= vsg::KeyModifier::MODKEY_Control;
89 modifierMask |= vsg::KeyModifier::MODKEY_Alt;
93 virtualKey =
static_cast<uint32_t
>(wParam);
98 if (keyState[VK_CAPITAL] & 0x01) modifierMask |= vsg::KeyModifier::MODKEY_CapsLock;
99 if (keyState[VK_NUMLOCK] & 0x01) modifierMask |= vsg::KeyModifier::MODKEY_NumLock;
103 if (keyState[VK_LSHIFT] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Shift;
104 if (keyState[VK_RSHIFT] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Shift;
105 if (keyState[VK_LCONTROL] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Control;
106 if (keyState[VK_RCONTROL] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Control;
107 if (keyState[VK_LMENU] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Alt;
108 if (keyState[VK_RMENU] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Alt;
111 keyModifier =
static_cast<vsg::KeyModifier
>(modifierMask);
115 int32_t numChars = ::ToAsciiEx(
static_cast<UINT
>(wParam), scanCode, keyState,
reinterpret_cast<WORD*
>(asciiKey), 0, ::GetKeyboardLayout(0));
119 modifiedKeySymbol =
static_cast<vsg::KeySymbol
>(asciiKey[0]);
124 modifiedKeySymbol = keySymbol;
131 VirtualKeyToKeySymbolMap _vk2vsg;