如何处理多个 KeyPress 事件
how to handle multiple KeyPress events
我需要我的 win 表单 - vb.net,来检测是否按下了 Control + P 以及 Control + Shift + P 以及是否只按下了字母 P。
我已经准备好应该如何完成,然后将其写入我的应用程序,但是我无法让它工作,所以我认为我做的事情根本上是错误的。
我的代码
Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles DataGridView1.KeyUp, MyBase.KeyDown
If e.KeyCode = Keys.F9 Then
System.Diagnostics.Process.Start("calc.exe")
End If
If e.KeyCode = (Keys.P AndAlso Keys.ControlKey AndAlso Keys.ShiftKey) Then
If PrintBatchStickersToolStripMenuItem.Enabled = False Then Exit Sub
If DataGridView1.Rows.Count = 0 Then Exit Sub
Dim rowIndex As Integer = 0
rowIndex = DataGridView1.CurrentRow.Index
PrintAllMatchingProductCodeToolStripMenuItem_Click(sender, e)
ElseIf e.KeyCode = (Keys.P AndAlso Keys.ControlKey) Then
If PrintBatchStickersToolStripMenuItem.Enabled = False Then Exit Sub
If DataGridView1.Rows.Count = 0 Then Exit Sub
Dim rowIndex As Integer = 0
rowIndex = DataGridView1.CurrentRow.Index
PrintBatchQTYToolStripMenuItem_Click(sender, e)
ElseIf e.KeyCode = Keys.P Then
If PrintBatchStickersToolStripMenuItem.Enabled = False Then Exit Sub
If DataGridView1.Rows.Count = 0 Then Exit Sub
Dim rowIndex As Integer = 0
rowIndex = DataGridView1.CurrentRow.Index
PrintSingleStickerToolStripMenuItem_Click(sender, e)
End If
End Sub
如果我删除括号,我可以让它检测到 P 键被按下,但永远不会检测到 Control 和 Shift 或它们两者的组合。
我在测试中将此添加到 KeyUp 事件中,如果我在按下键时执行此操作,并且用户按住键,代码将一遍又一遍地循环打印标签的多个副本。我需要代码只执行一次。
根据我的理解,keypress 无法处理控制键和 shift 键。
我的按键设置有问题吗,因为按键可能会在不同的时间被释放?如果我不能使用 keyup 如何处理 keydown 时不打印多次?
您需要使用 KeyData
而不是 KeyCode
,并且您需要正确组合 Keys
值:
Select Case e.KeyData
Case Key.P
'P was pressed without modifiers.
Case Keys.Control Or Key.P
'Ctrl+P was pressed without other modifiers.
Case Keys.Control Or Keys.Shift Or Keys.P
'Ctrl+Shift+P was pressed without other modifiers.
End Select
使用 Or
而不是 And
可能看起来很奇怪,但这是按位运算,而不是布尔运算。如果您了解按位逻辑的工作原理(您应该了解),那么使用 Or
的原因就很明显了。
替代方案:
If e.KeyCode = Keys.P AndAlso Not e.Alt Then
If e.Control Then
If e.Shift Then
'Ctrl+Shift+P was pressed without other modifiers.
Else
'Ctrl+P was pressed without other modifiers.
End If
Else
'P was pressed without modifiers.
End If
End If
我需要我的 win 表单 - vb.net,来检测是否按下了 Control + P 以及 Control + Shift + P 以及是否只按下了字母 P。
我已经准备好应该如何完成,然后将其写入我的应用程序,但是我无法让它工作,所以我认为我做的事情根本上是错误的。
我的代码
Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles DataGridView1.KeyUp, MyBase.KeyDown
If e.KeyCode = Keys.F9 Then
System.Diagnostics.Process.Start("calc.exe")
End If
If e.KeyCode = (Keys.P AndAlso Keys.ControlKey AndAlso Keys.ShiftKey) Then
If PrintBatchStickersToolStripMenuItem.Enabled = False Then Exit Sub
If DataGridView1.Rows.Count = 0 Then Exit Sub
Dim rowIndex As Integer = 0
rowIndex = DataGridView1.CurrentRow.Index
PrintAllMatchingProductCodeToolStripMenuItem_Click(sender, e)
ElseIf e.KeyCode = (Keys.P AndAlso Keys.ControlKey) Then
If PrintBatchStickersToolStripMenuItem.Enabled = False Then Exit Sub
If DataGridView1.Rows.Count = 0 Then Exit Sub
Dim rowIndex As Integer = 0
rowIndex = DataGridView1.CurrentRow.Index
PrintBatchQTYToolStripMenuItem_Click(sender, e)
ElseIf e.KeyCode = Keys.P Then
If PrintBatchStickersToolStripMenuItem.Enabled = False Then Exit Sub
If DataGridView1.Rows.Count = 0 Then Exit Sub
Dim rowIndex As Integer = 0
rowIndex = DataGridView1.CurrentRow.Index
PrintSingleStickerToolStripMenuItem_Click(sender, e)
End If
End Sub
如果我删除括号,我可以让它检测到 P 键被按下,但永远不会检测到 Control 和 Shift 或它们两者的组合。
我在测试中将此添加到 KeyUp 事件中,如果我在按下键时执行此操作,并且用户按住键,代码将一遍又一遍地循环打印标签的多个副本。我需要代码只执行一次。
根据我的理解,keypress 无法处理控制键和 shift 键。
我的按键设置有问题吗,因为按键可能会在不同的时间被释放?如果我不能使用 keyup 如何处理 keydown 时不打印多次?
您需要使用 KeyData
而不是 KeyCode
,并且您需要正确组合 Keys
值:
Select Case e.KeyData
Case Key.P
'P was pressed without modifiers.
Case Keys.Control Or Key.P
'Ctrl+P was pressed without other modifiers.
Case Keys.Control Or Keys.Shift Or Keys.P
'Ctrl+Shift+P was pressed without other modifiers.
End Select
使用 Or
而不是 And
可能看起来很奇怪,但这是按位运算,而不是布尔运算。如果您了解按位逻辑的工作原理(您应该了解),那么使用 Or
的原因就很明显了。
替代方案:
If e.KeyCode = Keys.P AndAlso Not e.Alt Then
If e.Control Then
If e.Shift Then
'Ctrl+Shift+P was pressed without other modifiers.
Else
'Ctrl+P was pressed without other modifiers.
End If
Else
'P was pressed without modifiers.
End If
End If