Vb.net 按键事件中的多按键检测

Vb.net 按键事件中的多按键检测,vb.net,textbox,keypress,control-characters,modifier-key,Vb.net,Textbox,Keypress,Control Characters,Modifier Key,我正在使用Visual Studio 2013并在VB.NET中编写。我正在创建一个在学校实习的项目。现在在我的一张表格里,你必须输入你的名字。这里有一些相关的信息 对于TextBox,我确实有ShortcutsEnabled=False属性,因此用户无法复制并粘贴到TextBox中。如果这是我的问题,那么我将不得不放弃它。现在,我这样做是为了使我的错误检查子项更简单、更精简,这样我就不必检查IsNumeric了。我不必检查的原因是,在文本框的KEYPRESS not keydown事件中,我有

我正在使用Visual Studio 2013并在VB.NET中编写。我正在创建一个在学校实习的项目。现在在我的一张表格里,你必须输入你的名字。这里有一些相关的信息

对于TextBox,我确实有ShortcutsEnabled=False属性,因此用户无法复制并粘贴到TextBox中。如果这是我的问题,那么我将不得不放弃它。现在,我这样做是为了使我的错误检查子项更简单、更精简,这样我就不必检查IsNumeric了。我不必检查的原因是,在文本框的KEYPRESS not keydown事件中,我有它限制了允许输入的内容

 Private Sub Nametxt_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Nametxt.KeyPress

    Dim AllowedChars As String = "abcdefghijklmnopqrstuvwxyz" 'The characters that you are allowed to enter

    If e.KeyChar <> ControlChars.Back And _
       ModifierKeys <> Keys.Shift _
       And e.KeyChar <> Chr(32) Then

        'e.KeyChar <> ControlChars.Back allows the user to use the backspac
        'ModifierKeys <> Keys.Shift allows the user to use the shift key so they can enter Capital letters
        'e.KeyChar <> Chr(32) allows the user to use the space bar so they can enter their First and Last name.

        If AllowedChars.IndexOf(e.KeyChar) = -1 Then
            e.Handled = True

        End If

注意:因为我使用的是KEYPRESS事件而不是keydown事件,所以唯一可行的e.key代码是e.keychar | | | | | | | e.keycode和e.keyvalue在此事件处理程序中不可用

为什么不在点击OK按钮或离开文本框时验证输入,而不是尝试测试,验证并控制每一次击键?这样就不可能绕过或绕过它。从长远来看,至少对我来说,在查看代码时,这会更容易,而错误检查的时间是检查击键时间的一半。这两种方法都不可行,需要将ShortcutsEnabled设置回True以检测Ctrl+A。这仅在Multiline=True时有效,对于单行文本框,您需要实现KeyDown事件来检测它,请调用SelectAll。您可以通过检查e.KeyChar>ChrW32禁用粘贴,但按下鼠标右键不会禁用上下文菜单。修复此问题需要从TextBox派生您自己的控件,以便您可以重写WndProc。这开始将你的毕业日期推迟了几个月。好吧,哈哈,谢谢你@HansPassant,我想这是因为我已经禁用了快捷方式。我只是不想让用户复制和粘贴。我感谢你的解释。这是非常彻底的:另一种“禁用”默认文本框上下文菜单的方法是为其指定您自己的上下文菜单,其中不包括剪切/复制/粘贴。菜单甚至可以是空的
If e.KeyChar <> ControlChars.Back And _
   ModifierKeys <> Keys.Shift And _
   e.KeyChar <> Chr(32) And _
End If