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

本文关键字:控件 语言 输入 Windows 窗体 应用程序 | 更新日期: 2023-09-27 18:37:25

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

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

这是我尝试过的,但我不希望用户按任何键,我想自动更改语言。

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

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

您可以使用

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属性的扩展程序提供程序组件。这样,您可以在设计时设置属性。这就是像ToolTipHelpProvider这样的组件的工作方式。

对于为许多国家/地区可用的其他语言寻求类似解决方案的人(例如:阿拉伯语,有"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;
如果要

更改系统输入语言(以便每个应用程序都将使用所选语言),只需使用模拟键盘按键的SendKeys:

SendKeys.Send("%+");

该字符串表示在 Windows 中默认更改输入语言Alt + Shift