0

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

4

1 回答 1

0

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

在更新 CurrentInputLanguage 之前,将焦点设置在表单中的控件上!

于 2021-01-11T15:59:27.947 回答