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 keyFlags = HIWORD(lParam);
45 WORD scanCode = LOBYTE(keyFlags);
46 BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED;
49 scanCode = MAKEWORD(scanCode, 0xE0);
51 uint32_t virtualKey = ::MapVirtualKeyEx(scanCode, MAPVK_VSC_TO_VK_EX, ::GetKeyboardLayout(0));
52 auto itr = _vk2vsg.find(virtualKey);
54 if (itr == _vk2vsg.end())
62 keySymbol = itr->second;
66 if (virtualKey == 0 || !::GetKeyboardState(keyState))
78 modifierMask |= vsg::KeyModifier::MODKEY_Shift;
83 modifierMask |= vsg::KeyModifier::MODKEY_Control;
88 modifierMask |= vsg::KeyModifier::MODKEY_Alt;
92 virtualKey =
static_cast<uint32_t
>(wParam);
97 if (keyState[VK_CAPITAL] & 0x01) modifierMask |= vsg::KeyModifier::MODKEY_CapsLock;
98 if (keyState[VK_NUMLOCK] & 0x01) modifierMask |= vsg::KeyModifier::MODKEY_NumLock;
102 if (keyState[VK_LSHIFT] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Shift;
103 if (keyState[VK_RSHIFT] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Shift;
104 if (keyState[VK_LCONTROL] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Control;
105 if (keyState[VK_RCONTROL] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Control;
106 if (keyState[VK_LMENU] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Alt;
107 if (keyState[VK_RMENU] & 0x80) modifierMask |= vsg::KeyModifier::MODKEY_Alt;
110 keyModifier =
static_cast<vsg::KeyModifier
>(modifierMask);
114 int32_t numChars = ::ToAsciiEx(
static_cast<UINT
>(wParam), scanCode, keyState,
reinterpret_cast<WORD*
>(asciiKey), 0, ::GetKeyboardLayout(0));
118 modifiedKeySymbol =
static_cast<vsg::KeySymbol
>(asciiKey[0]);
123 modifiedKeySymbol = keySymbol;
130 VirtualKeyToKeySymbolMap _vk2vsg;
183 class VSG_DECLSPEC Win32_Window :
public vsg::Inherit<vsg::Window, Win32_Window>
187 Win32_Window() =
delete;
188 Win32_Window(
const Win32_Window&) =
delete;
189 Win32_Window operator=(
const Win32_Window&) =
delete;
191 const char* instanceExtensionSurfaceName()
const override {
return VK_KHR_WIN32_SURFACE_EXTENSION_NAME; }
193 bool valid()
const override {
return _window; }
195 bool visible()
const override;
201 void resize()
override;
203 operator HWND()
const {
return _window; }
209 virtual ~Win32_Window();
211 void _initSurface()
override;
214 bool _windowMapped =
false;