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

时间:2015-01-02 19:01:06

标签: c#

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

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

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

6 个答案:

答案 0 :(得分:7)

命名空间Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName中的

System.Threading返回您称为默认文化的内容,与键盘布局无关。即在我的计算机上,它返回"de",这是我用于日期和数字格式的文化。但是,我使用的是US-ASCII键盘,.Culture.Name.LayoutName来自System.Windows.Forms.InputLanguage.CurrentInputLanguage,分别返回"en-US""US"

Thread.CurrentThread.CurrentCulture提供了许多其他信息,例如KeyboardLayoutIdDisplayName(本地化文化名称),EnglishNameDateTimeFormat等。


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

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

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

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

答案 1 :(得分:3)

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

InputLanguage myCurrentLang = InputLanguage.CurrentInputLanguage;

答案 2 :(得分:1)

您可以通过调用GetKeyboardLayout Windows API函数来实现此目的。

键盘布局是由线程完成的。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

string lang = InputLanguage.CurrentInputLanguage.Culture.Name;

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

答案 5 :(得分:0)

    foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages)
    {

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

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

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

int zeros[sizeof(yourArray)];
if(memcmp(yourArray,zeros,sizeof(yourArray))==0)
//do things
else
//do things