如何处理多个 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