【问题标题】:Detect current keyboard language/layout name in multi-language computer在多语言计算机中检测当前键盘语言/布局名称
【发布时间】:2015-03-01 01:56:45
【问题描述】:

我正在尝试用 C# 开发一个需要检测用户选择的语言(键盘布局)的应用程序。 但是我的电脑上安装了两种语言,代码总是返回默认的一种,即使我在运行应用程序之前更改了语言。

InputLanguage myCurrentLanguage = InputLanguage.InstalledInputLanguages[1]; // here I can see collection of languages 
InputLanguage myCurrentLanguage2 = InputLanguage.CurrentInputLanguage; // always return first or default one

有什么技术可以检测到真正选择/运行的语言吗?

【问题讨论】:

  • 请注意,如果您使用语言栏更改输入,而不是系统默认语言,此代码对我有用(这似乎不起作用,但 Windows 8 语言控制面板令人困惑所以我可能没有正确设置)

标签: c#


【解决方案1】:

Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName 在命名空间System.Threading 中返回您所谓的默认区域性,并且与键盘布局无关。 IE。在我的计算机上,这将返回 "de",这是我用于日期和数字格式的文化。但是,我使用的是美国 ASCII 键盘,.Culture.Name.LayoutNameSystem.Windows.Forms.InputLanguage.CurrentInputLanguage 分别返回 "en-US""US"

Thread.CurrentThread.CurrentCulture 提供了很多附加信息,例如KeyboardLayoutIdDisplayName(本地化文化名称)、EnglishNameDateTimeFormat 等等。


我做了一些测试,发现了一个奇怪的行为。我显示了 Windows 语言栏并选择了辅助输入语言。但每当我启动一个小小的 test-WinForms 应用程序时,输入语言就会自动切换回默认语言。应用程序启动后,我将输入语言切换回辅助语言。现在只剩下这个了。

在这两种情况下,这都为我提供了正确的输入语言(显示在语言栏上的语言):

lblInputLanguage.Text = InputLanguage.CurrentInputLanguage.Culture.Name;
lblKeyboardLayout.Text = InputLanguage.CurrentInputLanguage.LayoutName;

超级用户上的这个帖子可能会解决这个问题:How to avoid keyboard layout automatically changing on windows

【讨论】:

  • 谢谢Olivier,我试过了,出现一个错误,CurrentCulture does not exist in Threading namespace。
  • System.Threading.Thread.CurrentCulture.TwoLetterISOLanguageName。或者使用using System.Threading; 只是Thread.CurrentCulture.TwoLetterISOLanguageName
  • 此示例处理文化并检索默认文化,但我需要可能不同的语言或键盘。例如:我的默认文化/键盘是英语,但第二个是德语。我想检测用户选择的键盘。
  • 例如,如果我尝试获取键盘 id,则 int KeybId = Thread.CurrentThread.CurrentCulture.KeyboardLayoutId;它仍然返回第一语言。
  • @Shaahin 每个线程都有自己的输入语言。当您启动一个新应用程序时,它会获得默认输入语言。请注意,当您更改应用程序时,键盘布局将切换回您之前在该应用程序中 选择的内容。没有全局输入语言。
【解决方案2】:

这个返回当前活动的输入语言(当前是您的键盘类型):

InputLanguage myCurrentLang = InputLanguage.CurrentInputLanguage;

【讨论】:

    【解决方案3】:

    您可以通过调用GetKeyboardLayout Windows API 函数来获取此信息。

    键盘布局是线程。

    我不知道是否有此功能的内置托管版本。

    【讨论】:

    • 我认为它在C#中不支持,它属于C++
    • 在链接页面的评论部分查看您需要从 C# 使用的互操作声明。
    • @Shaahin Windows API 不属于任何单一语言。您可以使用DllImport 访问非托管 API:webtropy.com/articles/art9-1.asp?f=GetKeyboardLayout
    • 根据reference sourceCurrentInputLanguage 只是调用GetKeyboardLayout,所以不清楚为什么会有所不同。
    【解决方案4】:

    对于 WPF(而不是 Windows 窗体)有 System.Windows.Input.InputLanguageManager,其中有 InputLanguageManager.Current.AvailableInputLanguagesInputLanguageManager.Current.CurrentInputLanguage 等。

    【讨论】:

      【解决方案5】:

      您必须取消选中Settings/Devices/Typing/Advanced Keyboard 下的设置let me set a different input method for each app window

      string lang = InputLanguage.CurrentInputLanguage.Culture.Name;
      

      工作。如果您这样做,它将返回您用于键入的当前语言布局,即使它与您的默认键盘语言不同。

      【讨论】:

        【解决方案6】:
        string StrCurrentLang = InputLanguage.CurrentInputLanguage.Culture.TwoLetterISOLanguageName;
        

        上行代码为您提供当前语言的最后两个字母符号

        另一方面,您可以使用向下段落代码更改当前语言

            foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages)
            {
        
                if (lang.Culture.TwoLetterISOLanguageName != StrCurrentLang )
                {
                    InputLanguage.CurrentInputLanguage = lang;
                    return;
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-22
          • 2014-02-24
          • 2011-03-06
          • 2019-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多