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

2024-05-07

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

例如:

目前我有

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/Invoke 一些 win32 API 才能获取该显示名称。

有什么想法吗?

EDIT:

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

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 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();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 替换 Select 语句中的 NULL 和空字符串

    我有一个专栏可以有NULL或空白区域 即 值 我想用有效值替换这两个值 例如 UNKNOWN 我发现的各种解决方案建议修改表本身内的值 然而 在这种情况下 这不是一个选项 因为数据库用于开发和 或修补得非常差的第三方应用程序 实际上 我认为
  • R 中的 Tabulizer 包:如何在特定标题后抓取表格

    如何从 PDF 中抓取一些标题文本前面的表格 我正在尝试 tabulizer 包 这是从特定页面获取表格的示例 波兰语 公共卫生需求地图 library tabulizer library tidyverse options java pa
  • 添加 TableRowSorter 将值添加到模型后会导致 java.lang.IndexOutOfBoundsException:无效范围

    将 TableRowSorter 添加到表及其相应模型后 任何相应的添加 专门在 firetabletablerowsinserted 处 都会导致异常 从测试中可以清楚地看出 GetRowCount 返回的值超出了模型范围 但是 在添加排
  • 使用 Jackson 和 Spring 序列化 Joda DateTime

    我在使用 Spring Boot 和 Jackson databind 2 5 2 将 Joda DateTime 从 java 序列化和反序列化为 json 并再次返回时遇到问题 我的 pom xml 看起来像这样
  • 批处理:在特定程序中打开特定文件?

    当记事本是 txt 文件的默认程序时 如何告诉 Windows 在写字板中打开 C test test txt 接受的答案对我不起作用 我不确定这是因为我试图运行的程序 还是因为路径中有空格 即使我用引号引起来 或者其他原因 不管怎样 我可
  • 不构建自己的错误跟踪系统的原因[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 现在我已经多次遇到一个团队的计划 他们想要构建自己的错误跟踪系统 不是作为产品 而是作为内部工具 我听到的赞成的论点通常是这样的 想要通过一些内部构建
  • 无法在 JavaCC 中加载主类

    我是人工智能学生 我们使用 JavaCC 我是新来的 我正在尝试简单的例子 但出现了一些错误 1 我从它的网站下载了JavaCC 0 6 2 我把它解压到C盘 3 我将此代码写入扩展名为 jj 的文件中 PARSE BEGIN Test i
  • 向 Java 类添加编程注释

    使用示例 我想在类字段上添加一个自定义注释 MyContainer 然后在所有此类字段上自动添加相关的 Hibernate 注释 取决于字段类型和属性 另外 我需要向类添加 JAXB XmlType 注释 并使类型名称基于类名称 我还想根据
  • Android 上的透明视频

    有什么办法让Android播放带有透明区域的视频吗 当我尝试在 VideoView 中播放包含透明区域的 WebM 视频时 视图的背景保持黑色 我希望看到透明区域上显示的父视图的背景 而不是黑色 到目前为止 我发现的唯一可行的解 决方案是从
  • C# 多线程 - 在线程之间移动对象

    我正在使用一个 winforms 控件 它既是一个 GUI 元素 又执行一些尚未向开发人员公开的内部处理 当这个组件被实例化时 可能需要 5 到 15 秒的时间才能准备好 所以我想做的就是将它放在另一个线程上 完成后将其带回 gui 线程并
  • 反应本机导航抽屉:按下覆盖层时抽屉不会关闭

    我尝试过很多建议https github com react navigation react navigation issues 5370 https github com react navigation react navigatio
  • 推送通知 Drupal 模块 - 删除设备(Web 服务)

    我已经开始使用这个模块 并且我已经成功注册设备 按照他的作者发布的说明进行操作 here http www danielhanold com story drupal 7 push notifications how to register
  • 如何从传统的java web应用程序(带有web.xml)迁移到spring boot?

    我想将我的项目切换到基于弹簧的产品 我的第一步是将我的 java web 应用程序从生成的 WAR 文件转换为由 spring boot 提供支持的独立可执行 jar 让我们从 github 中获取一个开源 Web 应用程序示例 Vaadi
  • 如何使用 jsPDF 和 HTML2Canvas 从网站获取多页 pdf?

    我有一个使用 HTML2Canvas 来截取屏幕截图的脚本div在页面中 然后使用 jsPDF 将其转换为 pdf 问题是生成的 pdf 只有一页 而屏幕截图在某些情况下需要不止一页 例如 屏幕截图大于 8 5x11 宽度很好 但我需要它来
  • 检查 mySQL 数据库中现有用户的最佳方法? [复制]

    这个问题在这里已经有答案了 我正在尝试在 PHP 中创建用户登录 创建脚本 并且想知道创建用户时检查用户名是否存在的最佳方法 目前 我有以下代码 function createUser uname pword server gt conne
  • 获取带有结束标记且缺少起始标记的精确 html()

    目前对于带有 HTML 的正文 hello p hai p span Welcome span 关于警报 body html 它提醒hello p hai p span Welcome span Fiddle http jsfiddle n
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 从soap标头中删除mustUnderstand属性

    如何从轴客户端中的soap标头中删除mustunderstand属性 即使我没有特别设置它 当我设置soap标头信息mustundertand时 actor属性会自动添加到soap消息中 有人知道如何删除它们吗 我正在使用 Axis2 1
  • 使用 django Rest 框架 ModelViewSet 类而不是 APIView 渲染表单

    我想使用其余框架为我的 django 模型创建样板表单 文档显示它使用 APIView http www django rest framework org topics html and forms rendering forms htt
  • 如何获取当前所选键盘布局的显示名称

    我需要以语言栏显示输入语言的方式向用户显示输入语言列表 例如 目前我有 class Program static void Main string args var langs InputLanguage InstalledInputLan