VB.NET中textbox捕捉组合键

 





最近开始看看Vb.net,不过刚开始看书就发现了一个问题,书上看到这样一段代码,目的是在textbox的keydown事件中捕捉组合键,可是我发现根本没有作用,到底是为什么呢?代码如下:


Private Sub TextBox2_KeyDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown

Dim res As
MsgBoxResult
Select Case e.KeyCode
Case Keys.Escape
res =
MsgBox("是否确定要取消输入?", Microsoft.VisualBasic.MsgBoxStyle.OkCancel, "警告")
If
res = Microsoft.VisualBasic.MsgBoxResult.Ok Then
TextBox2.Text = ""
End
If
Case Keys.Enter
res = MsgBox("是否确定要将数据保留到历史记录中?",
Microsoft.VisualBasic.MsgBoxStyle.OkCancel, "警告")
If res =
Microsoft.VisualBasic.MsgBoxResult.Ok Then
TextBox1.Text = TextBox1.Text +
TextBox2.Text + ControlChars.CrLf
TextBox2.Text = ""
End If
Case
Keys.Control
Select Case e.KeyData
Case Keys.A

TextBox2.SelectionStart = 0
TextBox2.SelectionLength =
Len(TextBox2.Text)
MsgBox("Ctrl+a")
Case Keys.C

Clipboard.SetDataObject(TextBox2.SelectedText)
MsgBox("Ctrl+c")
Case
Keys.V
Dim iData As IDataObject
iData = Clipboard.GetDataObject()


If (iData.GetDataPresent(DataFormats.Text)) Then

TextBox2.SelectedText = iData.GetData(DataFormats.Text)
Else

MsgBox("Could not retrieve data off the clipboard.")
End If

MsgBox("Ctrl+v")
Case Keys.X

Clipboard.SetDataObject(TextBox2.SelectedText)
TextBox2.SelectedText =
""
MsgBox("Ctrl+x")
End Select
Case Keys.F1
MsgBox("练习使用键盘事件",
Microsoft.VisualBasic.MsgBoxStyle.MsgBoxHelp, "关于")
End Select
End
Sub


经过自己的调试和网上的讨论,结论是这种方法是不行的,当你按下CONTROL的时候,会处发一次keydown事件,这时e.keycode=keys.control

而再当你按下C的时候,又会触发一次keydown事件,这时的e.keycode=keys.c

所以说在keydown事件里,不能通过e.keycode来判断是否按下了两个按钮,

但是KeyEventArgs,提供了CONTROL,ALT,SHIFT属性来让你判断是否按住的功能键


由此看来书上的代码是不对的,不知道书的作者有没有调试过程序,调试的时候发现只要ctrl被按下,那么keycode就是17,而keydata则是一个很大的数,没有实际的意义。


正确的判断组合键的方法是这样的:


Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If
e.Control And e.KeyCode = Keys.A Then
            MsgBox("Ctrl A")
       
End If
    End Sub


所以上面的代码应该改为:


Private Sub TextBox2_KeyDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
        If
e.Control And e.KeyCode = Keys.C Then e.SuppressKeyPress = False
'允许Ctrl+C
        If e.Control And e.KeyCode = Keys.V Then e.SuppressKeyPress
= False '允许Ctrl+V


        Dim res As MsgBoxResult
        Select Case
e.KeyCode
            Case Keys.Escape
                res =
MsgBox("是否确定要取消输入?", Microsoft.VisualBasic.MsgBoxStyle.OkCancel,
"警告")
                If res = Microsoft.VisualBasic.MsgBoxResult.Ok
Then
                    TextBox2.Text = ""
                End
If
            Case Keys.Enter
                res =
MsgBox("是否确定要将数据保留到历史记录中?", Microsoft.VisualBasic.MsgBoxStyle.OkCancel,
"警告")
                If res = Microsoft.VisualBasic.MsgBoxResult.Ok
Then
                    TextBox1.Text = TextBox1.Text + TextBox2.Text +
ControlChars.CrLf
                    TextBox2.Text = ""
               
End If
            Case Keys.A
                If (e.Control = True)
Then
                    TextBox2.SelectionStart = 0
                   
TextBox2.SelectionLength = Len(TextBox2.Text)
                   
MsgBox("Ctrl+a")
                End If
            Case
Keys.C
                If (e.Control = True) Then
                   
Clipboard.SetDataObject(TextBox2.SelectedText)
                   
MsgBox("Ctrl+c")
                End If
            Case
Keys.V
                If (e.Control = True) Then
                    Dim
iData As IDataObject
                    iData =
Clipboard.GetDataObject()


                    If (iData.GetDataPresent(DataFormats.Text))
Then
                        TextBox2.SelectedText =
iData.GetData(DataFormats.Text)
                   
Else
                        MsgBox("Could not retrieve data off the
clipboard.")
                    End If
                   
MsgBox("Ctrl+v")
                End If
            Case
Keys.X
                If (e.Control = True) Then
                   
Clipboard.SetDataObject(TextBox2.SelectedText)
                   
TextBox2.SelectedText = ""
                   
MsgBox("Ctrl+x")
                End If
            Case
Keys.F1
                MsgBox("练习使用键盘事件",
Microsoft.VisualBasic.MsgBoxStyle.MsgBoxHelp, "关于")
        End Select
   
End Sub


这样就可以了,呵呵!上网的时候发现很多人都对这段代码有疑问,可惜都没有答案,希望对后来的学习者有用吧!