我有一个用 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 中达到预期的效果?