更新屏幕键盘的输入语言

问题描述

我有一个用 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 之前,将焦点设置在表单中的控件上!