【问题标题】:Update input language of on screen keyboard更新屏幕键盘的输入语言
【发布时间】:2021-01-11 12:02:03
【问题描述】:

我有一个用 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 中实现预期效果提出任何建议吗?

【问题讨论】:

    标签: c# .net input-language


    【解决方案1】:

    对于遇到此问题的任何人,答案都非常简单......

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多