问题描述
我有一个用 C# .NET 5 编写的 Windows 窗体应用程序,带有一个 webview2 控件,该控件托管一个基于信息亭的应用程序,该应用程序将在触摸屏上全屏运行。
应用程序将使用屏幕键盘进行用户输入。该应用程序托管在我们自己的机器上,仅用于我们的应用程序,因此更改系统输入语言正是我们想要实现的。
我需要允许用户选择他们自己的输入语言。在 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 之前,将焦点设置在表单中的控件上!