From: Rémi Bernon <rbernon@codeweavers.com> Based on patches from Etaash Mathamsetty and Matteo Bruni. --- dlls/win32u/input.c | 13 +++++++++++-- dlls/win32u/message.c | 9 ++++++--- dlls/win32u/win32u_private.h | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 733eb604fdc..c1718f89093 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -1215,13 +1215,13 @@ UINT WINAPI NtUserMapVirtualKeyEx( UINT code, UINT type, HKL layout ) * * Map a scancode to a virtual key with KBD information. */ -USHORT map_scan_to_kbd_vkey( USHORT scan, HKL layout ) +USHORT map_scan_to_kbd_vkey( USHORT scan, HKL layout, UINT *mapped ) { const KBDTABLES *kbd_tables; USHORT vsc2vk[0x300]; UINT vkey; - if ((vkey = user_driver->pMapVirtualKeyEx( scan, MAPVK_VSC_TO_VK_EX, layout )) != -1) return vkey; + if ((vkey = user_driver->pMapVirtualKeyEx( scan, MAPVK_VSC_TO_VK_EX, layout )) != -1) goto done; if (!(kbd_tables = user_driver->pKbdLayerDescriptor( layout ))) kbd_tables = &kbdus_tables; @@ -1232,6 +1232,15 @@ USHORT map_scan_to_kbd_vkey( USHORT scan, HKL layout ) if (kbd_tables != &kbdus_tables) user_driver->pReleaseKbdTables( kbd_tables ); + /* remap some scancodes as native does */ +done: + switch (vkey & 0xff) + { + case VK_PAUSE: *mapped = 0x45; break; + case VK_RSHIFT: *mapped = 0x136; break; + case VK_NUMLOCK: *mapped = 0x145; break; + default: *mapped = scan; break; + } return vkey; } diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 4a8ba26d3d5..9eacc4b2b62 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3945,7 +3945,7 @@ NTSTATUS send_hardware_message( HWND hwnd, UINT flags, const INPUT *input, LPARA */ if (req->input.kbd.flags & KEYEVENTF_SCANCODE) { - UINT scan = input->ki.wScan; + UINT scan = input->ki.wScan, dummy; /* TODO: Use the keyboard layout of the target hwnd, once * NtUserGetKeyboardLayout supports non-current threads. */ HKL layout = NtUserGetKeyboardLayout( 0 ); @@ -3953,8 +3953,11 @@ NTSTATUS send_hardware_message( HWND hwnd, UINT flags, const INPUT *input, LPARA if (flags & SEND_HWMSG_INJECTED) scan = scan & 0xff; if (req->input.kbd.flags & KEYEVENTF_EXTENDEDKEY) scan |= 0xe000; - req->input.kbd.vkey = map_scan_to_kbd_vkey( scan, layout ); - req->input.kbd.scan &= 0xff; + req->input.kbd.vkey = map_scan_to_kbd_vkey( scan, layout, (flags & SEND_HWMSG_INJECTED) ? &dummy : &scan ); + if (scan & ~0xff) req->input.kbd.flags |= KEYEVENTF_EXTENDEDKEY; + else req->input.kbd.flags &= ~KEYEVENTF_EXTENDEDKEY; + + req->input.kbd.scan = scan & 0xff; req->input.kbd.flags &= ~KEYEVENTF_SCANCODE; } break; diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index be303ae4d13..2b7113f4cae 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -110,7 +110,7 @@ extern void update_mouse_tracking_info( HWND hwnd ); extern void update_current_mouse_window( HWND hwnd, INT hittest, POINT pos ); extern BOOL process_wine_clipcursor( HWND hwnd, UINT flags, BOOL reset ); extern BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ); -extern USHORT map_scan_to_kbd_vkey( USHORT scan, HKL layout ); +extern USHORT map_scan_to_kbd_vkey( USHORT scan, HKL layout, UINT *mapped ); /* menu.c */ extern UINT draw_nc_menu_bar( HDC hdc, RECT *rect, HWND hwnd ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11129