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;
184 class VSG_DECLSPEC Win32_Window :
public vsg::Inherit<vsg::Window, Win32_Window>
188 Win32_Window() =
delete;
189 Win32_Window(
const Win32_Window&) =
delete;
190 Win32_Window operator=(
const Win32_Window&) =
delete;
192 const char* instanceExtensionSurfaceName()
const override {
return VK_KHR_WIN32_SURFACE_EXTENSION_NAME; }
194 bool valid()
const override {
return _window; }
196 bool visible()
const override;
202 void resize()
override;
204 operator HWND()
const {
return _window; }
210 virtual ~Win32_Window();
212 void _initSurface()
override;
215 bool _windowMapped =
false;