mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 17:35:07 +00:00
- Fix NtUserVkKeyScanEx to support current thread keyboard layout or use the one provided by handle. See bug report 4269 and the related bug report 4272.
svn path=/trunk/; revision=41040
This commit is contained in:
parent
13d610f832
commit
9897a55a56
|
@ -492,7 +492,7 @@ SHORT WINAPI
|
||||||
VkKeyScanExW(WCHAR ch,
|
VkKeyScanExW(WCHAR ch,
|
||||||
HKL dwhkl)
|
HKL dwhkl)
|
||||||
{
|
{
|
||||||
return (SHORT) NtUserVkKeyScanEx(ch, dwhkl, 0);
|
return (SHORT) NtUserVkKeyScanEx(ch, dwhkl, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -502,7 +502,7 @@ VkKeyScanExW(WCHAR ch,
|
||||||
SHORT WINAPI
|
SHORT WINAPI
|
||||||
VkKeyScanW(WCHAR ch)
|
VkKeyScanW(WCHAR ch)
|
||||||
{
|
{
|
||||||
return VkKeyScanExW(ch, GetKeyboardLayout(0));
|
return (SHORT) NtUserVkKeyScanEx(ch, 0, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2697,7 +2697,7 @@ NTAPI
|
||||||
NtUserVkKeyScanEx(
|
NtUserVkKeyScanEx(
|
||||||
WCHAR wChar,
|
WCHAR wChar,
|
||||||
HKL KeyboardLayout,
|
HKL KeyboardLayout,
|
||||||
DWORD Unknown2);
|
BOOL bUsehHK);
|
||||||
|
|
||||||
DWORD
|
DWORD
|
||||||
NTAPI
|
NTAPI
|
||||||
|
|
|
@ -1000,22 +1000,31 @@ DWORD
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtUserVkKeyScanEx(
|
NtUserVkKeyScanEx(
|
||||||
WCHAR wChar,
|
WCHAR wChar,
|
||||||
HKL KeyboardLayout,
|
HKL hKeyboardLayout,
|
||||||
DWORD Unknown2)
|
BOOL UsehKL ) // TRUE from KeyboardLayout, FALSE from pkbl = (THREADINFO)->KeyboardLayout
|
||||||
{
|
{
|
||||||
/* FIXME: currently, this routine doesnt seem to need any locking */
|
|
||||||
PKBDTABLES KeyLayout;
|
PKBDTABLES KeyLayout;
|
||||||
PVK_TO_WCHAR_TABLE vtwTbl;
|
PVK_TO_WCHAR_TABLE vtwTbl;
|
||||||
PVK_TO_WCHARS10 vkPtr;
|
PVK_TO_WCHARS10 vkPtr;
|
||||||
size_t size_this_entry;
|
size_t size_this_entry;
|
||||||
int nMod;
|
int nMod;
|
||||||
DWORD CapsMod = 0, CapsState = 0;
|
PKBL pkbl = NULL;
|
||||||
|
DWORD CapsMod = 0, CapsState = 0, Ret = -1;
|
||||||
|
|
||||||
DPRINT("NtUserVkKeyScanEx() wChar %d, KbdLayout 0x%p\n", wChar, KeyboardLayout);
|
DPRINT("NtUserVkKeyScanEx() wChar %d, KbdLayout 0x%p\n", wChar, hKeyboardLayout);
|
||||||
|
UserEnterShared();
|
||||||
|
|
||||||
if(!KeyboardLayout)
|
if (UsehKL)
|
||||||
return -1;
|
{
|
||||||
KeyLayout = UserHklToKbl(KeyboardLayout)->KBTables;
|
if ( !hKeyboardLayout || !(pkbl = UserHklToKbl(hKeyboardLayout)))
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
else // From VkKeyScanAW it is FALSE so KeyboardLayout is white noise.
|
||||||
|
{
|
||||||
|
pkbl = ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->KeyboardLayout;
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyLayout = pkbl->KBTables;
|
||||||
|
|
||||||
for (nMod = 0; KeyLayout->pVkToWcharTable[nMod].nModifications; nMod++)
|
for (nMod = 0; KeyLayout->pVkToWcharTable[nMod].nModifications; nMod++)
|
||||||
{
|
{
|
||||||
|
@ -1038,13 +1047,16 @@ NtUserVkKeyScanEx(
|
||||||
CapsMod = KeyLayout->pCharModifiers->ModNumber[CapsState];
|
CapsMod = KeyLayout->pCharModifiers->ModNumber[CapsState];
|
||||||
DPRINT("nMod %d wC %04x: CapsMod %08x CapsState %08x MaxModBits %08x\n",
|
DPRINT("nMod %d wC %04x: CapsMod %08x CapsState %08x MaxModBits %08x\n",
|
||||||
nMod, wChar, CapsMod, CapsState, KeyLayout->pCharModifiers->wMaxModBits);
|
nMod, wChar, CapsMod, CapsState, KeyLayout->pCharModifiers->wMaxModBits);
|
||||||
return ((CapsMod << 8)|(vkPtr->VirtualKey & 0xff));
|
Ret = ((CapsMod << 8)|(vkPtr->VirtualKey & 0xff));
|
||||||
|
goto Exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vkPtr = (PVK_TO_WCHARS10)(((BYTE *)vkPtr) + size_this_entry);
|
vkPtr = (PVK_TO_WCHARS10)(((BYTE *)vkPtr) + size_this_entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
Exit:
|
||||||
|
UserLeave();
|
||||||
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue