检测多语言计算机中的当前键盘语言/布局名称
本文关键字:语言 键盘 布局 计算机 检测 | 更新日期: 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
提供了许多附加信息,例如KeyboardLayoutId
、DisplayName
(本地化区域性名称)、EnglishName
、DateTimeFormat
等。
我做了一些测试,注意到一种奇怪的行为。我显示了 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.AvailableInputLanguages
和InputLanguageManager.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;
}
}