'How to get keyboard layout name from a keyboard layout identifier?
My application has to display all the installed input languages in the system and the keyboard layouts against each input languages.
For example:
[InputLaguage]
Tamil
[Keyboard layouts]
US
Murasu Anjal
Tamil
English
US
We can get installed language identifiers and keyboard layout identifiers from the
GetKeyboardLayoutList(User32.dll)
API function by splitting LWORD and HWORD.
But I didn’t find a way to get a keyboard layout name from the keyboard layout identifier.
From the above example, I have to get the US, Murasu Anjal and Tamil against Tamil language.
Please help…
Thanks
Solution 1:[1]
It's not a complete answer for your question, but here's a good chunk of it that took me a couple of hours to compile by hand. It's a mapping of every layout code to the layout name that my version of Windows 7 had available. I had to type the names by hand, so excuse any typos there. The codes were gathered programatically.
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Input;
namespace DesktopDictation.DeviceButtonMappings
{
public class KeyboardLayout
{
const int KL_NAMELENGTH = 9;
[DllImport("user32.dll")]
private static extern long GetKeyboardLayoutName(StringBuilder pwszKLID);
//each keyboard layout is defined in Windows as a hex code
public static string GetLayoutCode()
{
var name = new StringBuilder(KL_NAMELENGTH);
GetKeyboardLayoutName(name);
return name.ToString();
}
//This is a mapping table from hex to descriptive name
public static String MapLayoutName(string code = null)
{
if (code == null)
code = GetLayoutCode();
switch (code)
{
case "0000041C":
return "Albanian";
case "00000401":
return "Arabic (101)";
case "00010401":
return "Arabic (102)";
case "00020401":
return "Arabic (102) Azerty";
case "0000042B":
return "Armenian eastern";
case "0001042B":
return "Armenian Western";
case "0000044D":
return "Assamese - inscript";
case "0000082C":
return "Azeri Cyrillic";
case "0000042C":
return "Azeri Latin";
case "0000046D":
return "Bashkir";
case "00000423":
return "Belarusian";
case "0000080C":
return "Belgian French";
case "00000813":
return "Belgian (period)";
case "0001080C":
return "Belgian (comma)";
case "00000445":
return "Bengali";
case "00010445":
return "Bengali - inscript (legacy)";
case "00020445":
return "Bengali - inscript";
case "0000201A":
return "Bosnian (cyrillic)";
case "00030402":
return "Bulgarian";
case "00000402":
return "Bulgarian(typewriter)";
case "00010402":
return "Bulgarian (latin)";
case "00020402":
return "Bulgarian (phonetic)";
case "00040402":
return "Bulgarian (phonetic traditional)";
case "00011009":
return "Canada Multilingual";
case "00001009":
return "Canada French";
case "00000C0C":
return "Canada French (legacy)";
case "00000404":
return "Chinese (traditional) - us keyboard";
case "00000804":
return "Chinese (simplified) -us keyboard";
case "00000C04":
return "Chinese (traditional, hong kong s.a.r.) - us keyboard";
case "00001004":
return "Chinese (simplified, singapore) - us keyboard";
case "00001404":
return "Chinese (traditional, macao s.a.r.) - us keyboard";
case "00000405":
return "Czech";
case "00020405":
return "Czech programmers";
case "00010405":
return "Czech (qwerty)";
case "0000041A":
return "Croatian";
case "00000439":
return "Deanagari - inscript";
case "00000406":
return "Danish";
case "00000465":
return "Divehi phonetic";
case "00010465":
return "Divehi typewriter";
case "00000413":
return "Dutch";
case "00000425":
return "Estonian";
case "00000438":
return "Faeroese";
case "0000040B":
return "Finnish";
case "0001083B":
return "Finnish with sami";
case "0000040C":
return "French";
case "00011809":
return "Gaelic";
case "00000437":
return "Georgian";
case "00020437":
return "Georgian (ergonomic)";
case "00010437":
return "Georgian (qwerty)";
case "00000407":
return "German";
case "00010407":
return "German (ibm)";
case "0000046F":
return "Greenlandic";
case "00000468":
return "Hausa";
case "0000040D":
return "Hebrew";
case "00010439":
return "Hindi traditional";
case "00000408":
return "Greek";
case "00010408":
return "Greek (220)";
case "00030408":
return "Greek (220) latin";
case "00020408":
return "Greek (319)";
case "00040408":
return "Greek (319) latin";
case "00050408":
return "Greek latin";
case "00060408":
return "Greek polyonic";
case "00000447":
return "Gujarati";
case "0000040E":
return "Hungarian";
case "0001040E":
return "Hungarian 101 key";
case "0000040F":
return "Icelandic";
case "00000470":
return "Igbo";
case "0000085D":
return "Inuktitut - latin";
case "0001045D":
return "Inuktitut - naqittaut";
case "00001809":
return "Irish";
case "00000410":
return "Italian";
case "00010410":
return "Italian (142)";
case "00000411":
return "Japanese";
case "0000044B":
return "Kannada";
case "0000043F":
return "Kazakh";
case "00000453":
return "Khmer";
case "00000412":
return "Korean";
case "00000440":
return "Kyrgyz cyrillic";
case "00000454":
return "Lao";
case "0000080A":
return "Latin america";
case "00000426":
return "Latvian";
case "00010426":
return "Latvian (qwerty)";
case "00010427":
return "Lithuanian";
case "00000427":
return "Lithuanian ibm";
case "00020427":
return "Lithuanian standard";
case "0000046E":
return "Luxembourgish";
case "0000042F":
return "Macedonian (fyrom)";
case "0001042F":
return "Macedonian (fyrom) - standard";
case "0000044C":
return "Malayalam";
case "0000043A":
return "Maltese 47-key";
case "0001043A":
return "Maltese 48-key";
case "0000044E":
return "Marathi";
case "00000481":
return "Maroi";
case "00000450":
return "Mongolian cyrillic";
case "00000850":
return "Mongolian (mongolian script)";
case "00000461":
return "Nepali";
case "00000414":
return "Norwegian";
case "0000043B":
return "Norwegian with sami";
case "00000448":
return "Oriya";
case "00000463":
return "Pashto (afghanistan)";
case "00000429":
return "Persian";
case "00000415":
return "Polish (programmers)";
case "00010415":
return "Polish (214)";
case "00000816":
return "Portuguese";
case "00000416":
return "Portuguese (brazillian abnt)";
case "00010416":
return "Portuguese (brazillian abnt2)";
case "00000446":
return "Punjabi";
case "00010418":
return "Romanian (standard)";
case "00000418":
return "Romanian (legacy)";
case "00020418":
return "Romanian (programmers)";
case "00000419":
return "Russian";
case "00010419":
return "Russian (typewriter)";
case "0002083B":
return "Sami extended finland-sweden";
case "0001043B":
return "Sami extended norway";
case "00000C1A":
return "Serbian (cyrillic)";
case "0000081A":
return "Serbian (latin)";
case "0000046C":
return "Sesotho sa Leboa";
case "00000432":
return "Setswana";
case "0000045B":
return "Sinhala";
case "0001045B":
return "Sinhala -Wij 9";
case "0000041B":
return "Slovak";
case "0001041B":
return "Slovak (qwerty)";
case "00000424":
return "Slovenian";
case "0001042E":
return "Sorbian extended";
case "0002042E":
return "Sorbian standard";
case "0000042E":
return "Sorbian standard (legacy)";
case "0000040A":
return "Spanish";
case "0001040A":
return "Spanish variation";
case "0000041D":
return "Swedish";
case "0000083B":
return "Swedish with sami";
case "00000807":
return "Swiss german";
case "0000100C":
return "Swiss french";
case "0000045A":
return "Syriac";
case "0001045A":
return "Syriac phonetic";
case "00000428":
return "Tajik";
case "00000449":
return "Tamil";
case "00000444":
return "Tatar";
case "0000044A":
return "Telugu";
case "0000041E":
return "Thai Kedmanee";
case "0002041E":
return "Thai Kedmanee (non-shiftlock)";
case "0001041E":
return "Thai Pattachote";
case "0003041E":
return "Thai Pattachote (non-shiftlock)";
case "00000451":
return "Tibetan (prc)";
case "0001041F":
return "Turkish F";
case "0000041F":
return "Turkish Q";
case "00000442":
return "Turkmen";
case "00000422":
return "Ukrainian";
case "00020422":
return "Ukrainian (enhanced)";
case "00000809":
return "United Kingdom";
case "00000452":
return "United Kingdom Extended";
case "00000409":
return "United States";
case "00010409":
return "United States - dvorak";
case "00030409":
return "United States - dvorak left hand";
case "00050409":
return "United States - dvorak right hand";
case "00004009":
return "United States - india";
case "00020409":
return "United States - international";
case "00000420":
return "Urdu";
case "00010480":
return "Uyghur";
case "00000480":
return "Uyghur (legacy)";
case "00000843":
return "Uzbek cyrillic";
case "0000042A":
return "Vietnamese";
case "00000485":
return "Yakut";
case "0000046A":
return "Yoruba";
case "00000488":
return "Wolof";
default:
return "unknown";
}
}
}
}
Solution 2:[2]
There is no in-built function to do this. You may have to use the solution posted here: How to convert Microsoft Locale ID (LCID) into language code
Solution 3:[3]
You can look at System.Windows.Forms/src/System/Windows/Forms/InputLanguage.cs that has a somewhat broken implementation right now.
Proper algorithm is posted here:
The keyboard layout name information is found in HKEY_LOCAL_MACHINE\system\currentcontrolset\control\keyboard layouts. I think .NET code should use the Low Word of GetKeyboardLayoutList, and iterate through all entries in HKLM\SystemCurrentControlSet\Control\Keyboard Layouts looking for matching low word. When low word is matching, if high word & 0xF000 then go look for match with Layout Id. If High word & 0xF000 == zero, use the high word to look up the entry in HKEY_LOCAL_MACHINE\system\currentcontrolset\control\keyboard layouts.
For example, if I had an entry like 0x040C0409 in GetKeyboardLayoutList, this would indicate English language with a French keyboard layout. I think you would want to look up the entry under 0000040C in this case.
After you have found proper registry path HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\ you can fetch localized Keyboard Layout name from Layout Display Name key with SHLoadIndirectString call (there is also Layout Text key that is layout name for legacy purposes) as documented here.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Community |
| Solution 3 |



