From 8ec1206ba011554608b0ef4448e6a04deaca551f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Thu, 6 May 2021 12:03:13 +0200 Subject: [PATCH] user32: Read "Layout Id" from registry in GetKeyboardLayoutNameW. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RĂ©mi Bernon Signed-off-by: Alexandre Julliard --- dlls/user32/input.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 70eca90b425..c447cb4b407 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -1110,7 +1110,9 @@ BOOL WINAPI GetKeyboardLayoutNameA(LPSTR pszKLID) */ BOOL WINAPI GetKeyboardLayoutNameW( WCHAR *name ) { - DWORD tmp; + WCHAR klid[KL_NAMELENGTH], value[5]; + DWORD value_size, tmp, i = 0; + HKEY hkey; HKL layout; TRACE_(keyboard)( "name %p\n", name ); @@ -1126,6 +1128,25 @@ BOOL WINAPI GetKeyboardLayoutNameW( WCHAR *name ) if (HIWORD( tmp ) == LOWORD( tmp )) tmp = LOWORD( tmp ); swprintf( name, KL_NAMELENGTH, L"%08X", tmp ); + if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Keyboard Layouts", &hkey )) + { + while (!RegEnumKeyW( hkey, i++, klid, ARRAY_SIZE(klid) )) + { + value_size = sizeof(value); + if (!RegGetValueW( hkey, klid, L"Layout Id", RRF_RT_REG_SZ, NULL, (void *)&value, &value_size )) + tmp = 0xf000 | (wcstoul( value, NULL, 16 ) & 0xfff); + else + tmp = wcstoul( klid, NULL, 16 ); + + if (HIWORD( layout ) == tmp) + { + lstrcpynW( name, klid, KL_NAMELENGTH ); + break; + } + } + RegCloseKey( hkey ); + } + TRACE_(keyboard)( "ret %s\n", debugstr_w( name ) ); return TRUE; }