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

C# 如何获取当前选定键盘布局的显示名称,c#,winapi,C#,Winapi,我需要以语言栏的显示方式向用户显示输入语言列表 例如: 目前我有 class Program { static void Main(string[] args) { var langs = InputLanguage.InstalledInputLanguages; foreach (InputLanguage lang in langs) { Console.WriteLine(lang.LayoutN

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

例如:

目前我有

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

        foreach (InputLanguage lang in langs)
        {
            Console.WriteLine(lang.LayoutName);
        }
    }
}
这将打印以下内容

US
Bulgarian
Bulgarian
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
正如你所见,我们无法区分这两个“保加利亚人” 哪一个是BGPT,哪一个只是BG

文化
对两者也是一样的。 唯一的区别是
lang.Handle
类型为
IntPtr
。 我想我必须使用句柄P/调用一些win32 API来获得该显示名称

有什么想法吗

编辑:

在powershell中执行
获取WinUserLanguageList
,将显示以下内容

US
Bulgarian
Bulgarian
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

如果PowerShell有您想要的东西,您随时可以从那里得到它。添加对C:\Program Files(x86)\reference assembly\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll和C:\Windows\Microsoft.NET\assembly\GAC\MSIL\Microsoft.InternationalSettings.Commands\v4.0\U 3.0.0\UUUU 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();
        }
    }
}

谢谢你的密码,但那不是我想要的。我需要将每个InputLanguage实例映射到适当的显示名称,以便我的用户可以毫不含糊地更改语言+键盘布局。事实证明,这不是一项简单的任务,可以通过Handle属性完成,但涉及大量代码。完成后我会发布一个答案。上面的代码怎么不能完成这个任务?第二段代码确实如此,您提到的句柄也是注册表项。如果您检查InputLanguage类的源代码,您将看到Microsoft所做的事情与我上面发布的第二段代码几乎相同