最近开始看看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
这样就可以了,呵呵!上网的时候发现很多人都对这段代码有疑问,可惜都没有答案,希望对后来的学习者有用吧!