diff --git a/reactos/subsys/win32k/include/input.h b/reactos/subsys/win32k/include/input.h index 00ec42f79ca..4619b680c27 100644 --- a/reactos/subsys/win32k/include/input.h +++ b/reactos/subsys/win32k/include/input.h @@ -10,7 +10,7 @@ InitKeyboardImpl(VOID); PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue(VOID); VOID W32kUnregisterPrimitiveMessageQueue(VOID); PKBDTABLES W32kGetDefaultKeyLayout(VOID); -VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyLayout); +VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyLayout, BYTE Prefix); BOOL FASTCALL IntBlockInput(PW32THREAD W32Thread, BOOL BlockIt); BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi); BOOL FASTCALL IntKeyboardInput(KEYBDINPUT *ki); diff --git a/reactos/subsys/win32k/ntuser/input.c b/reactos/subsys/win32k/ntuser/input.c index 127224af612..b596176c56a 100644 --- a/reactos/subsys/win32k/ntuser/input.c +++ b/reactos/subsys/win32k/ntuser/input.c @@ -628,7 +628,7 @@ KeyboardThreadMain(PVOID StartContext) lParam |= (KeyInput.MakeCode & 0xff) << 16; - if (KeyInput.Flags & (KEY_E0 | KEY_E1)) + if (KeyInput.Flags & KEY_E0) lParam |= (1 << 24); if (ModifierState & MOD_ALT) @@ -673,7 +673,9 @@ KeyboardThreadMain(PVOID StartContext) * keyboard layout in use. */ W32kKeyProcessMessage(&msg, - FocusThread->Tcb.Win32Thread->KeyboardLayout); + FocusThread->Tcb.Win32Thread->KeyboardLayout, + KeyInput.Flags & KEY_E0 ? 0xE0 : + (KeyInput.Flags & KEY_E1 ? 0xE1 : 0)); if (GetHotKey(InputWindowStation, ModifierState, diff --git a/reactos/subsys/win32k/ntuser/keyboard.c b/reactos/subsys/win32k/ntuser/keyboard.c index 99653e3b97b..71c565c69fd 100644 --- a/reactos/subsys/win32k/ntuser/keyboard.c +++ b/reactos/subsys/win32k/ntuser/keyboard.c @@ -966,7 +966,11 @@ NtUserGetKeyNameText( LONG lParam, LPWSTR lpString, int nSize ) { * appropriately. */ -VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { +VOID FASTCALL +W32kKeyProcessMessage(LPMSG Msg, + PKBDTABLES KeyboardLayout, + BYTE Prefix) +{ DWORD ScanCode = 0, ModifierBits = 0; DWORD i = 0; DWORD BaseMapping = 0; @@ -984,6 +988,7 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { { VK_UP, VK_NUMPAD8 }, { VK_PRIOR, VK_NUMPAD9 }, { 0,0 } }; + PVSC_VK VscVkTable; if( !KeyboardLayout || !Msg || (Msg->message != WM_KEYDOWN && Msg->message != WM_SYSKEYDOWN && @@ -1005,10 +1010,40 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) { ScanCode = (Msg->lParam >> 16) & 0xff; BaseMapping = Msg->wParam = IntMapVirtualKeyEx( ScanCode, 1, KeyboardLayout ); - if( ScanCode >= KeyboardLayout->bMaxVSCtoVK ) - RawVk = 0; + if( Prefix == 0 ) + { + if( ScanCode >= KeyboardLayout->bMaxVSCtoVK ) + RawVk = 0xff; + else + RawVk = KeyboardLayout->pusVSCtoVK[ScanCode]; + } else - RawVk = KeyboardLayout->pusVSCtoVK[ScanCode]; + { + if( Prefix == 0xE0 ) + { + /* ignore shift codes */ + if( ScanCode == 0x2A || ScanCode == 0x36 ) + { + IntUnLockQueueState; + return; + } + VscVkTable = KeyboardLayout->pVSCtoVK_E0; + } + else if( Prefix == 0xE1 ) + { + VscVkTable = KeyboardLayout->pVSCtoVK_E1; + } + + RawVk = 0xff; + while (VscVkTable->Vsc) + { + if( VscVkTable->Vsc == ScanCode ) + { + RawVk = VscVkTable->Vk; + } + VscVkTable++; + } + } if ((ModifierBits & NUMLOCK_BIT) && !(ModifierBits & GetShiftBit(KeyboardLayout, VK_SHIFT)) &&