如何获取当前所选键盘布局的显示名称

时间:2019-07-18 15:49:32

标签: c# winapi

我需要以语言栏显示输入语言的方式向用户显示输入语言的列表。

例如:

enter image description here

当前我有

class Program
{
    static void Main(string[] args)
    {
        var langs = InputLanguage.InstalledInputLanguages;

        foreach (InputLanguage lang in langs)
        {
            Console.WriteLine(lang.LayoutName);
        }
    }
}

这将打印以下内容

US
Bulgarian
Bulgarian

如您所见,我们无法分辨两个“保加利亚人”之间的区别 哪一个是BGPT,哪一个仅是BG。

Culture也是相同的。 唯一的区别是lang.Handle类型的IntPtr。 我想我必须使用句柄P /调用一些win32 API来获得该显示名称。

有什么想法吗?

编辑:

在powershell中执行Get-WinUserLanguageList会显示以下内容

LanguageTag     : en-US
Autonym         : English (United States)
EnglishName     : English
LocalizedName   : English (United States)
ScriptName      : Latin
InputMethodTips : {0409:00000409}
Spellchecking   : True
Handwriting     : False

LanguageTag     : bg
Autonym         : български
EnglishName     : Bulgarian
LocalizedName   : Bulgarian
ScriptName      : Cyrillic
InputMethodTips : {0402:00040402, 0402:00030402}
Spellchecking   : True
Handwriting     : False

输入法提示是这里的关键。

0402:00040402是BG,而0402:00030402是BGPT

1 个答案:

答案 0 :(得分:3)

如果PowerShell具有所需的功能,则始终可以从那里获得。添加对C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ WindowsPowerShell \ 3.0 \ System.Management.Automation.dll和C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.InternationalSettings.Commands \ v4的引用。 0_3.0.0.0__31bf3856ad364e35 \ Microsoft.InternationalSettings.Commands.dll

class Program
{
    static void Main(string[] args)
    {
        System.Management.Automation.PowerShell ps = System.Management.Automation.PowerShell.Create();
        List<Microsoft.InternationalSettings.Commands.WinUserLanguage> userLangList = ps.AddCommand("Get-WinUserLanguageList").Invoke()[0].BaseObject as List<Microsoft.InternationalSettings.Commands.WinUserLanguage>;
        foreach (Microsoft.InternationalSettings.Commands.WinUserLanguage userLang in userLangList)
        {
            Console.WriteLine("{0,-31}{1,-47}", "Antonym", userLang.Autonym);
            Console.WriteLine("{0,-31}{1,-47}", "EnglishName", userLang.EnglishName);
            Console.WriteLine("{0,-31}{1,-47}", "Handwriting", userLang.Handwriting);
            Console.WriteLine("{0,-31}{1,-47}", "InputMethodTips", String.Join(",", userLang.InputMethodTips));
            Console.WriteLine("{0,-31}{1,-47}", "LanguageTag", userLang.LanguageTag);
            Console.WriteLine("{0,-31}{1,-47}", "LocalizedName", userLang.LocalizedName);
            Console.WriteLine("{0,-31}{1,-47}", "ScriptName", userLang.ScriptName);
            Console.WriteLine("{0,-31}{1,-47}", "Spellchecking", userLang.Spellchecking);
            Console.WriteLine();
        }
    }
}

或者,Microsoft从注册表中获得了很多此类信息,您可以执行相同的操作:

class Program
{
    static void Main(string[] args)
    {
        (new System.Security.Permissions.RegistryPermission(System.Security.Permissions.PermissionState.Unrestricted)).Assert();

        Microsoft.Win32.RegistryKey rkLanguages = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Control Panel\\International\\User Profile");
        foreach (string str in rkLanguages.GetSubKeyNames())
        {
            Console.WriteLine(str);
            Microsoft.Win32.RegistryKey rkLang = rkLanguages.OpenSubKey(str);
            foreach (string value in rkLang.GetValueNames())
            {
                if (rkLang.GetValueKind(value) == Microsoft.Win32.RegistryValueKind.DWord)
                {
                    string blah = String.Concat("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\", value.Split(new char[] { ':' })[1]);
                    Microsoft.Win32.RegistryKey rkKeyboardLayout = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(blah);
                    Console.WriteLine(rkKeyboardLayout.GetValue("Layout Text"));
                }
            }
            Console.WriteLine();
        }

        System.Security.CodeAccessPermission.RevertAssert();
    }
}