检测多语言计算机中的当前键盘语言/布局名称

本文关键字:语言 键盘 布局 计算机 检测 | 更新日期: 2023-09-27 18:35:52

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

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

是否有任何技术可以检测真正的选择/运行语言?

检测多语言计算机中的当前键盘语言/布局名称

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

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


我做了一些测试,注意到一种奇怪的行为。我显示了 Windows 语言栏并选择了辅助输入语言。但是每当我启动一个小的test-WinForms应用程序时,输入语言都会自动切换回默认语言。应用程序启动后,我将输入语言切换回辅助语言。现在它停留在这一点上。

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

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

超级用户上的这个线程可能会阐明这个问题:如何避免键盘布局在Windows上自动更改

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

InputLanguage myCurrentLang = InputLanguage.CurrentInputLanguage;

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

键盘布局按线程排列。

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

对于WPF(而不是Windows Forms),有System.Windows.Input.InputLanguageManager,它具有InputLanguageManager.Current.AvailableInputLanguagesInputLanguageManager.Current.CurrentInputLanguage等。

您必须

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

string lang = InputLanguage.CurrentInputLanguage.Culture.Name;

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

string StrCurrentLang = InputLanguage.CurrentInputLanguage.Culture.TwoLetterISOLanguageName;

上行代码得到当前语言的两个最后一个字母符号

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

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