Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多语言计算机中检测当前键盘语言/布局名称_C# - Fatal编程技术网

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

C# 在多语言计算机中检测当前键盘语言/布局名称,c#,C#,我正在尝试用C语言开发一个应用程序,它需要检测用户选择的语言(键盘布局)。 无论我的计算机上安装了两种语言,代码始终返回默认语言,即使我在运行应用程序之前更改了语言 InputLanguage myCurrentLanguage = InputLanguage.InstalledInputLanguages[1]; // here I can see collection of languages InputLanguage myCurrentLanguage2 = InputLanguage

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

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

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

您可以通过调用Windows API函数来实现这一点

键盘布局是通过线程实现的


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

命名空间
系统中的Thread.CurrentThread.CurrentCulture.TwoLetterIsLanguageName
。Threading返回您所称的默认区域性,与键盘布局无关。也就是说,在我的计算机上,它返回我用于日期和数字格式的区域性“de”。但是,我使用的是US-ASCII键盘和
System.Windows.Forms.InputLanguage.CurrentInputLanguage
中的
.Culture.Name
.LayoutName
分别返回
“en-US”
“US”


Thread.CurrentThread.CurrentCulture
提供了许多附加信息,如
KeyboardLayoutId
DisplayName
(本地化的区域性名称),
EnglishName
DateTimeFormat
等等


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

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


超级用户上的此线程可能会说明问题:

此线程返回当前活动的输入语言(当前为您的键盘类型):


用于WPF(而不是Windows窗体)还有一个具有
InputLanguageManager.Current.AvailableInputLanguages
InputLanguageManager.Current.CurrentInputLanguage
等功能的应用程序。您必须取消选中设置
让我为应用程序的
设置/设备/键入/高级键盘下的每个应用程序窗口设置不同的输入方法

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;
        }
    }

我认为它在C#中不支持,它属于C++。请参阅链接页面评论部分中需要从C#使用的互操作声明。@Shaahin Windows API不属于任何一种语言。您可以使用
DllImport
访问非托管API:根据,
CurrentInputLanguage
只调用
GetKeyboardLayout
,因此不清楚为什么会有任何不同。请注意,如果您使用语言栏(而不是系统默认语言)更改输入,此代码对我有效,(这似乎不起作用,但Windows 8语言控制面板令人困惑,因此我可能没有正确设置)谢谢Olivier,我试过了,一个错误显示CurrentCulture在线程命名空间中不存在。
System.Threading.Thread.CurrentCulture.TwoLetterIsLanguageName
。或者使用System.Threading;
使用
,只需
Thread.CurrentCulture.TwoLetterIsLanguageName
。此示例处理区域性并检索默认值,但我需要可能不同的语言或键盘。例如:我的默认区域性/键盘是英语,但第二个是德语。我希望按用户检测选定的键盘。例如,如果我尝试获取键盘id,int KeybId=Thread.CurrentThread.CurrentCulture.KeyboardLayoutId;它仍然返回第一种语言。@Shaahin每个线程都有自己的输入语言。启动新应用程序时,它将获得默认的输入语言。请注意,更改应用程序时,键盘布局将切换回以前在该应用程序中选择的语言。没有全局输入语言。
string StrCurrentLang = InputLanguage.CurrentInputLanguage.Culture.TwoLetterISOLanguageName;
    foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages)
    {

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