VB.net - 从e.Key获取PreviewKeyDown / KeyPress事件中的“真实”字符

时间:2013-10-10 11:41:46

标签: regex vb.net events keyboard

我在为TextBox构建输入过滤器时遇到了一些困难(WFP,但这不应该在这里) 我需要压制所有输入,但是:
-Digits(整数 - 没有浮点数,组)
- 基本数学符号:(,),+, - ,*,/

是的,目标是进行一种公式评估。这部分适用于Sriptcontrol-Method (来自:http://www.vb-tips.com/Eval.aspx) 我还发现了几个导致过滤的正则表达式(对不起,记不住来源......):

 Regex("[\d\(\)\+\-\*\/]")

现在的问题是,例如字符'+'永远不会出现在e.Key Argument中 按NumPad - '+'给我 e.Key = 85
e.Key.Tostring =添加

尝试使用键盘'+' e.Key = 141
e.Key.ToString = OemPlus

所以正则表达式永远不会找到这些允许的字符匹配 由于Windows识别出我点击的键并将我在键盘上看到的字符放置在我的键盘上,我猜,必须有一种方法来“准确”捕获用户意味着击中的键:-)
此外,我需要抑制任何修饰符字符(例如我的德语布局上的AltGr + 2:square)
这里我的代码粘贴(由于试验可能会有点混乱)

        Private Sub tb_PreviewKeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs) Handles TB0.PreviewKeyDown
        Dim s As TextBox = sender
        Debug.WriteLine(e.Key.ToString & " -" & e.Key)
        Dim rx As New Regex("[\d\(\)\+\-\*\/]|Add|Subtract|Divide|Multiply|Return|Tab|Back")
        If Not rx.IsMatch(e.Key.ToString) Then
            e.Handled = True
            Return
        End If
        If e.Key = Key.Enter Or e.Key = Key.Tab Then
            If s.Text.Trim = "" Then Return
            If Not IsNumeric(s.Text) Then
                Try
                    Dim ev As New MSScriptControl.ScriptControl
                    ev.Language = "VBScript"
                    ev.AllowUI = False
                    ev.Reset()
                    s.Text = CStr(Math.Round(CDbl(ev.Eval(s.Text))))
                    s.SelectAll()
                Catch ex As Exception
                    s.SelectAll()
                    e.Handled = True
                    Return
                End Try
            End If
            s.SelectAll()
        End If
    End Sub


任何关于此的提示都受到高度赞赏 提前谢谢,
丹尼尔

1 个答案:

答案 0 :(得分:0)

Hans Passant的评论解决了我的问题!