更新屏幕键盘的输入语言



我有一个用C#.NET 5编写的Windows窗体应用程序,它带有一个webview2控件,该控件托管一个基于kiosk的应用程序,该应用程序将在触摸屏上全屏运行。

该应用程序将使用屏幕上的键盘进行用户输入。应用程序托管在我们自己的机器上,这些机器只用于我们的应用程序,因此更改系统输入语言正是我们想要实现的。

我需要允许用户选择自己的输入语言。在4.7.2中,我可以通过设置InputLanguage.CurrentInputLanguage来实现这一点,它动态更新屏幕上的键盘输入语言,你也可以在任务栏中看到系统输入语言的更新(在生产中,用户将看不到(。

在.NET 5中,设置相同的值不会产生所需的效果,屏幕上的键盘不会反映更改后的输入语言,任务栏中的输入语言也不会更新。

我注意到幕后的图书馆发生了变化,这显然是我遇到这个问题的原因。

我在一个简单的虚拟应用程序中尝试了以下操作,但没有成功:

private void btnEnglish_Click(object sender, EventArgs e)
{
var language = InputLanguage.FromCulture(System.Globalization.CultureInfo.GetCultureInfo("en-GB"));
if (InputLanguage.InstalledInputLanguages.IndexOf(language) >= 0)
InputLanguage.CurrentInputLanguage = language;
ChangeSystemInputLanguage(language);
}

private static void ChangeSystemInputLanguage(InputLanguage language)
{
Application.OleRequired();

IntPtr handleOld = ActivateKeyboardLayout(new HandleRef(language, language.Handle), 0);
if (handleOld == IntPtr.Zero)
{
throw new ArgumentException("ErrorBadInputLanguage", nameof(language));
}
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr ActivateKeyboardLayout(HandleRef hkl, int uFlags);

除了降级到4.7.2或在WPF中重新编写(例如使用InputLanguageManager(之外,有人能建议我如何在.NET 5.0中达到预期效果吗?

对于任何有这个问题的人来说,答案都非常简单。。。

在更新CurrentInputLanguage之前,请将焦点设置在窗体中的控件上!

最新更新