2015-01-02 60 views
2

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

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

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

+0

只需注意,如果使用t更改输入,他语言栏,而不是系统默认语言(似乎不工作,但Windows 8语言控制面板混淆,所以我可能没有设置正确) – Rhumborl

回答

1

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

键盘布局是由线程。

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

+0

我认为它不支持在C#中,它属于C++ – Shaahin

+0

在链接页面的注释部分查看您需要从C#使用的互操作声明。 –

+1

@Shaahin Windows API不属于任何单一语言。您可以使用'DllImport'访问非托管API:http://www.webtropy.com/articles/art9-1.asp?f=GetKeyboardLayout – JLRishe

7

Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName在命名空间System.Threading返回所谓的默认文化,并且与键盘布局无关。即在我的电脑上,这返回"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; 

上的超级用户这线程可能会揭示问题的一些轻:How to avoid keyboard layout automatically changing on windows

+0

谢谢Olivier,我试过了,CurrentCulture不存在于线程名字空间中。 – Shaahin

+0

'System.Threading.Thread.CurrentCulture.TwoLetterISOLanguageName'。或者使用System.Threading;'Thread'。CurrentCulture.TwoLetterISOLanguageName'。 –

+0

这个例子处理的文化和检索默认的,但我需要的语言或键盘可能是不同的。例如: :我的默认文化/键盘是英语,但第二个是德语。我想检测用户选择的键盘。 – Shaahin

1

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

InputLanguage myCurrentLang = InputLanguage.CurrentInputLanguage;