从 Windows 10 虚拟键盘输入到 WPF 文本框中的快乐表情符号未在文本框的 PreviewTextInput 事件中捕获

Posted

技术标签:

【中文标题】从 Windows 10 虚拟键盘输入到 WPF 文本框中的快乐表情符号未在文本框的 PreviewTextInput 事件中捕获【英文标题】:Happy Emoji entered into a WPF textbox from a Windows 10 virtual keyboard is NOT captured in the textbox's PreviewTextInput event 【发布时间】:2018-06-19 10:37:38 【问题描述】:

我想禁止在 WPF 应用程序的输入字段中输入所有表情符号(情感图标)。我实现它的方式是:

txtUserName.PreviewTextInput += LoginPreviewTextInput;

LoginPreviewTextInput 如下所示:

private void LoginPreviewTextInput(object sender, TextCompositionEventArgs e)

     if (!InputValidator.IsValidInput(e.Text))
          e.Handled = true;

InputValidator 的 IsValidInput 如下所示:

public class InputValidator

    //These characters are allowed in the textbox
    private static string pattern = @"^[\w\s,\.\(\)~!@\#\$%\^&\*-=\+\[\]\\:;'""<>\?\\|]*$";
    public static bool IsValidInput(string previewedInput)
    
        var matches = Regex.Matches(previewedInput, pattern);
        if (matches.Count == 1)
        
            return true;
        
        return false;
    

奇怪的是它适用于虚拟键盘中的所有表情符号图标,除了快乐表情符号。 它不起作用,因为一旦我在 Windows 虚拟键盘中输入此 Emoji(它适用于所有其他 Emoji),就不会调用 LoginPreviewTextInput。

Happy Emoji 如下图所示:

在文本框中输入快乐表情后,文本框如下所示:

快乐的表情符号已输入到文本框中。您可以看到,当文本框的文本属性为空时,甚至会显示一个水印。 当我在 snoop 中查看文本框的 text 属性时,确实是空的,而有界属性是 viewmodel 是空的(从未调用过 setter)。

同样,仅针对这个特定的表情符号(快乐的)发生。所有其他 Emoji 都进入 LoginPreviewTextInput 方法,不匹配正则表达式并被忽略。

【问题讨论】:

可能是#638 @wpf.2000things.com/tag/previewtextinput 回答你 @JSR 不幸的是,链接中提供的信息对我没有帮助:我在 TextBox_PreviewKeyDown 和 PasteHandler 的开头都设置了一个断点。通过虚拟键盘输入快乐表情符号时,不会到达这些断点。 【参考方案1】:

在花了一些时间研究这个问题后,我找到了解决这个问题的办法。

为什么你可以按下快乐表情符号?

您能够从虚拟键盘将快乐表情符号输入到您的应用程序中的原因是它是默认的 Windows 符号之一/具有附加的实际字符。 (类似的东西)。

虽然其他表情符号可以这样显示,但我认为虚拟键盘的默认行为是仅使用这些符号,因为它们已经可用并且不需要创建各种字符。

许多其他表情符号也会发生这种情况,例如星星和心形。

这是按下“Happy face”时显示的内容:

这是按“爱眼脸”时显示的内容:

如您所见,实际发生的情况是所有其他表情符号都被标记为它们前面的反斜杠。

你如何解决你的问题?

您的问题的解决方案可能是让正则表达式检查代码是否符合设定的条件。例如,所有字符都是 [a-Z] 或您想要的任何字符。这很可能是解决问题的更好方法,因为这意味着您不会创建大量的排除列表。

【讨论】:

以上是关于从 Windows 10 虚拟键盘输入到 WPF 文本框中的快乐表情符号未在文本框的 PreviewTextInput 事件中捕获的主要内容,如果未能解决你的问题,请参考以下文章

如何监听windows虚拟键盘

WPF 应用程序的虚拟触控键盘

Windows 10 上 TabTip.exe(虚拟键盘)的大小和位置?

如何禁用所有 WPF 应用程序的虚拟键盘?

[分享]WPF 虚拟键盘

WPF 禁用TextBox的触摸后自动弹出虚拟键盘