Skip to content

Commit 41bb87a

Browse files
Merge pull request #1248 from appcodegen/WindowsKeyHandling
Fixed various issues with handling 'extended' keys on the Windows pla…
2 parents f9fc3e0 + 7b095d7 commit 41bb87a

File tree

2 files changed

+35
-25
lines changed

2 files changed

+35
-25
lines changed

include/vsg/platform/win32/Win32_Window.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,17 @@ namespace vsgWin32
3939
bool getKeySymbol(WPARAM wParam, LPARAM lParam, vsg::KeySymbol& keySymbol, vsg::KeySymbol& modifiedKeySymbol, vsg::KeyModifier& keyModifier)
4040
{
4141
uint16_t modifierMask = 0;
42-
uint32_t virtualKey = ::MapVirtualKeyEx((lParam >> 16) & 0xff, MAPVK_VSC_TO_VK_EX, ::GetKeyboardLayout(0));
42+
43+
// see https://learn.microsoft.com/en-us/windows/win32/inputdev/about-keyboard-input#keystroke-message-flags
44+
WORD vkCode = LOWORD(wParam); // virtual-key code
45+
WORD keyFlags = HIWORD(lParam);
46+
WORD scanCode = LOBYTE(keyFlags); // scan code
47+
BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
48+
49+
if (isExtendedKey)
50+
scanCode = MAKEWORD(scanCode, 0xE0);
51+
52+
uint32_t virtualKey = ::MapVirtualKeyEx(scanCode, MAPVK_VSC_TO_VK_EX, ::GetKeyboardLayout(0));
4353
auto itr = _vk2vsg.find(virtualKey);
4454

4555
if (itr == _vk2vsg.end())
@@ -80,7 +90,7 @@ namespace vsgWin32
8090
break;
8191

8292
default:
83-
virtualKey = static_cast<int>(wParam);
93+
virtualKey = static_cast<uint32_t>(wParam);
8494
break;
8595
}
8696

@@ -102,7 +112,7 @@ namespace vsgWin32
102112

103113
// The actual keystroke is what we get after the ::ToAscii call
104114
char asciiKey[2];
105-
int32_t numChars = ::ToAscii(static_cast<UINT>(wParam), (lParam >> 16) & 0xff, keyState, reinterpret_cast<WORD*>(asciiKey), 0);
115+
int32_t numChars = ::ToAsciiEx(static_cast<UINT>(wParam), scanCode, keyState, reinterpret_cast<WORD*>(asciiKey), 0, ::GetKeyboardLayout(0));
106116
if (numChars == 1)
107117
{
108118
// it is indeed an ascii character. 0-127

src/vsg/platform/win32/Win32_Window.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ KeyboardMap::KeyboardMap()
122122
{VK_RETURN , KEY_Return},
123123
{VK_SHIFT , KEY_Undefined},
124124
{VK_CONTROL , KEY_Undefined},
125-
{VK_MENU , KEY_Undefined},
125+
{VK_MENU , KEY_Alt_L},
126126
{VK_PAUSE , KEY_Pause},
127127
{VK_CAPITAL , KEY_Undefined},
128128
{VK_KANA , KEY_Undefined},
@@ -149,32 +149,32 @@ KeyboardMap::KeyboardMap()
149149
{VK_RIGHT , KEY_Right },
150150
{VK_DOWN , KEY_Down },
151151
{VK_SELECT , KEY_Select},
152-
{VK_PRINT , KEY_Print},
152+
{VK_SNAPSHOT , KEY_Print},
153153
{VK_EXECUTE , KEY_Execute},
154154
{VK_SNAPSHOT , KEY_Undefined},
155155
{VK_INSERT , KEY_Insert},
156156
{VK_DELETE , KEY_Delete},
157157
{VK_HELP , KEY_Help},
158158
{VK_LWIN , KEY_Super_L},
159159
{VK_RWIN , KEY_Super_R},
160-
{VK_APPS , KEY_Undefined},
160+
{VK_APPS , KEY_Menu},
161161
{VK_SLEEP , KEY_Undefined},
162-
{VK_NUMPAD0 , KEY_Undefined},
163-
{VK_NUMPAD1 , KEY_Undefined},
164-
{VK_NUMPAD2 , KEY_Undefined},
165-
{VK_NUMPAD3 , KEY_Undefined},
166-
{VK_NUMPAD4 , KEY_Undefined},
167-
{VK_NUMPAD5 , KEY_Undefined},
168-
{VK_NUMPAD6 , KEY_Undefined},
169-
{VK_NUMPAD7 , KEY_Undefined},
170-
{VK_NUMPAD8 , KEY_Undefined},
171-
{VK_NUMPAD9 , KEY_Undefined},
172-
{VK_MULTIPLY , KEY_Undefined},
173-
{VK_ADD , KEY_Undefined},
174-
{VK_SEPARATOR , KEY_Undefined},
175-
{VK_SUBTRACT , KEY_Undefined},
176-
{VK_DECIMAL , KEY_Undefined},
177-
{VK_DIVIDE , KEY_Undefined},
162+
{VK_NUMPAD0 , KEY_KP_0},
163+
{VK_NUMPAD1 , KEY_KP_1},
164+
{VK_NUMPAD2 , KEY_KP_2},
165+
{VK_NUMPAD3 , KEY_KP_3},
166+
{VK_NUMPAD4 , KEY_KP_4},
167+
{VK_NUMPAD5 , KEY_KP_5},
168+
{VK_NUMPAD6 , KEY_KP_6},
169+
{VK_NUMPAD7 , KEY_KP_7},
170+
{VK_NUMPAD8 , KEY_KP_8},
171+
{VK_NUMPAD9 , KEY_KP_9},
172+
{VK_MULTIPLY , KEY_KP_Multiply},
173+
{VK_ADD , KEY_KP_Add},
174+
{VK_SEPARATOR , KEY_KP_Separator},
175+
{VK_SUBTRACT , KEY_KP_Subtract},
176+
{VK_DECIMAL , KEY_KP_Decimal},
177+
{VK_DIVIDE , KEY_KP_Divide},
178178
{VK_F1 , KEY_F1},
179179
{VK_F2 , KEY_F2},
180180
{VK_F3 , KEY_F3},
@@ -208,13 +208,13 @@ KeyboardMap::KeyboardMap()
208208
{VK_NAVIGATION_ACCEPT , KEY_Undefined}, // reserved
209209
{VK_NAVIGATION_CANCEL , KEY_Undefined}, // reserved
210210
{VK_NUMLOCK , KEY_Undefined},
211-
{VK_SCROLL , KEY_Undefined},
211+
{VK_SCROLL , KEY_Scroll_Lock},
212212
{VK_LSHIFT , KEY_Shift_L},
213213
{VK_RSHIFT , KEY_Shift_R},
214214
{VK_LCONTROL , KEY_Control_L},
215215
{VK_RCONTROL , KEY_Control_R},
216-
{VK_LMENU , KEY_Menu},
217-
{VK_RMENU , KEY_Menu},
216+
{VK_LMENU , KEY_Alt_L},
217+
{VK_RMENU , KEY_Alt_R},
218218
{VK_BROWSER_BACK , KEY_Undefined},
219219
{VK_BROWSER_FORWARD , KEY_Undefined},
220220
{VK_BROWSER_REFRESH , KEY_Undefined},

0 commit comments

Comments
 (0)