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

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

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

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

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

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


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

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

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

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

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

 InputLanguage myCurrentLang = InputLanguage.CurrentInputLanguage; 

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

键盘布局是通过线程。

我不知道是否有这个函数的内置托管版本。

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