如何在Windows窗体应用程序中更改特定控件的输入语言?

8

当焦点进入TextBox时,我希望将语言更改为特定语言(例如波斯语),当焦点离开TextBox时,将语言更改为之前设置的原始语言。

如何在Windows窗体应用程序中更改输入语言,当特定控件获得焦点时?

以下是我尝试过的方法,但我不想让用户按任何键,而是自动更改语言。

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Shift && e.Alt)
    {
        MessageBox.Show("***language of keybord changed***");
    }
}

那是语言栏的热键,你看不到它。如果想了解它,可以使用 InputLanguageChanged 事件 - Hans Passant
您可以使用InputLanguage.CurrentInputLanguage在程序中编程更改输入语言。只需处理Enter,将其设置为所需的语言,并处理Leave事件,将其设置回先前选择的输入语言即可。 - Reza Aghaei
3个回答

18
您可以使用InputLanguage.CurrentInputLanguage以编程方式更改输入语言。

只需处理您的控件的Enter事件,将InputLanguage.CurrentInputLanguage设置为所需语言,并处理控件的Leave事件,并将其设置回先前选择的输入语言。

在下面的代码中,当我进入TextBox1时,我将输入语言设置为Persian,并在离开控件时将其设置回先前的语言:

InputLanguage original;
private void textBox1_Enter(object sender, EventArgs e)
{
    original = InputLanguage.CurrentInputLanguage;
    var culture = System.Globalization.CultureInfo.GetCultureInfo("fa-IR");
    var language = InputLanguage.FromCulture(culture);
    if (InputLanguage.InstalledInputLanguages.IndexOf(language) >= 0)
        InputLanguage.CurrentInputLanguage = language;
    else
        InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
}

private void textBox1_Leave(object sender, EventArgs e)
{
    InputLanguage.CurrentInputLanguage = original;
}
为了测试示例,您应该在操作系统上安装fa-IR作为输入语言,否则它将将语言设置为默认输入语言。您可以使用您所知道的已安装在操作系统上的其他区域性输入语言。
注意:如果您需要在表单中广泛使用此功能,可以创建一个提供InputLanguage属性的 Extender Provider 组件作为一个想法。这样,您可以在设计时设置属性。组件如ToolTipHelpProvider也是这样工作的方式。

3

如果您正在寻找其他语言的类似解决方案,这些语言在许多国家都可用(例如:阿拉伯语,有“ar-SA”,“ar-EG”和许多其他语言),则可以使用以下方法获取正确的语言,而不考虑国家:

对于WinForms: VB:

originalInputLang = InputLanguage.CurrentInputLanguage
Dim lang = InputLanguage.InstalledInputLanguages.OfType(Of InputLanguage).Where(Function(l) l.Culture.Name.StartsWith("ar")).FirstOrDefault()
        If lang IsNot Nothing Then InputLanguage.CurrentInputLanguage = lang

C#:

originalInputLang = InputLanguage.CurrentInputLanguage;
var lang = InputLanguage.InstalledInputLanguages.OfType<InputLanguage>().Where(l => l.Culture.Name.StartsWith("ar")).FirstOrDefault();
if (lang != null) {
    InputLanguage.CurrentInputLanguage = lang;
}

针对 WPF: VB:

Dim origianl As Globalization.CultureInfo //outside the event handler



// in the entered event handler:
origianl = InputLanguageManager.Current.CurrentInputLanguage
Dim newLang = InputLanguageManager.
    Current.
    AvailableInputLanguages.
    OfType(Of Globalization.CultureInfo).
    Where(Function(i) i.Name.StartsWith("ar")).
    FirstOrDefault()
If newLang IsNot Nothing Then InputLanguageManager.Current.CurrentInputLanguage = newLang

//in the leave event handler:
InputLanguageManager.Current.CurrentInputLanguage = original

C#:

System.Globalization.CultureInfo original; // outside the event handlers

// in the enter event handler:
original = InputLanguageManager.Current.CurrentInputLanguage;
var newLang = InputLanguageManager.
    Current.
    AvailableInputLanguages.
    OfType<System.Globalization.CultureInfo>().
    Where(l => l.Name.StartsWith("ar")).
    FirstOrDefault();

if (newLang != null)
{
    InputLanguageManager.Current.CurrentInputLanguage = newLang;
}

// in the leave event handler:
InputLanguageManager.Current.CurrentInputLanguage = original;

0

如果您想更改系统输入语言(使每个应用程序都使用所选语言),您可以简单地使用SendKeys模拟键盘按键:

SendKeys.Send("%+");

该字符串表示 Alt + Shift,在Windows中默认情况下会更改输入语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接