11

我正在尝试检测在 VB.NET 中同时按下的键“Control”和“t”。我到目前为止的代码如下:

Private Sub frmTimingP2P_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyValue = Keys.ControlKey And e.KeyValue = Keys.T Then
        MessageBox.Show("Ctrl + T")
    End If
End Sub

我可以通过删除 and 语句和第二个 keyvalue 语句来检测一个键或另一个,但是当我尝试这个时我并没有真正得到任何东西。还有其他方法吗?

谢谢

4

6 回答 6

12

首先,And在你的代码中应该是AndAlso因为它是一个逻辑运算符。And在 VB 中是位运算符。接下来,您可以使用该Modifiers属性来测试修饰键:

If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Control Then
    MessageBox.Show("Ctrl + T")
End If

条件的e.KeyCode And Not Keys.Modifiers第一部分中的 是屏蔽修饰键所必需的。

If e.Modifiers = Keys.Ctrl也可以写成If e.Control

或者,我们可以通过直接询问组合Ctrl+是否T被按下来整理这两个查询:

If e.KeyCode = (Keys.T Or Keys.Ctrl) Then …

在这两个片段中,我们都使用了位掩码

于 2012-12-10T15:24:18.257 回答
4

Private Sub frmMain_Zaporka_KeyDown(sender As Object, e As KeyEventArgs) 处理 MyBase.KeyDown

Select Case e.KeyData
    Case (Keys.Control + Keys.Shift + Keys.F12)
        MsgBox("Control + Shift + F12")
    Case (Keys.Escape)
        Me.Close()
End Select

' or

If e.KeyCode = Keys.F12 AndAlso e.Modifiers = (Keys.Control Or Keys.Shift) Then
    MsgBox("Control + Shift + F12")
ElseIf e.KeyCode = Keys.Escape Then
    Me.Close()
End If

' or

Select Case e.KeyCode
    Case (Keys.F12 And e.Control And e.Shift)
        MsgBox("Control + Shift + F12")
    Case (Keys.Escape)
        Me.Close()
End Select

结束子

于 2014-02-26T13:33:47.243 回答
2

我有同样的问题,但为了让这个工作我必须将 forms KeyPreview属性设置为true。在 Visual Studio 中,您可以在 Forms [Design] Property 窗口中更改它或在加载时更改属性。

Private Sub frmTimingP2P_Load(ByVal sender As System.Object, ByVal e As _ 
                               System.EventArgs) Handles MyBase.Load

    Me.KeyPreview = True

End Sub

然后使用:

Private Sub frmTimingP2P_KeyDown(ByVal Sender As Object, ByVal e As _ 
                        System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown


        If (e.KeyCode = Keys.T AndAlso e.Modifiers = Keys.Control) Then
            MessageBox.Show("Ctrl + T")
        End If

End Sub

或上述答案中提供的其他程序逻辑。

于 2013-05-08T16:54:33.213 回答
2

我会把你从长代码中拯救出来。这里:

If e.Control And e.Alt And e.KeyCode = Keys.G Then
    MsgBox("Control Alt G")
End If
于 2015-11-19T10:13:16.010 回答
1

我现在没有安装 vb.net 但是在你的 keydown 或 keypress 事件上试试这个:

If e.KeyCode = Keys.T AndAlso e.Control = True Then
MsgBox("Ctrl + T")
End If
于 2012-12-10T15:24:34.190 回答
0

我实际上通过实验发现,当通过我们添加到代码中的“KeyDown”或“KeyUp”例程处理代码时,KeyPreview 设置是无关紧要的。也许按键的自动内置代码考虑了 KeyPreview 设置,但我们甚至不必考虑它。

我发现最好的方法是 KuroMoro 的答案中显示的方法,使用 e.KeyData 加上各种“案例陈述”。当某些键与 Control 键同时按下时,以下将符号插入文本框的效果很好。

Private Sub Comments_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Comment.KeyDown, Response.KeyDown
    Select Case e.KeyData
        Case (Keys.S + Keys.Control)
            SendKeys.Send("♠")
        Case (Keys.H + Keys.Control)
            SendKeys.Send("♥")
        Case (Keys.D + Keys.Control)
            SendKeys.Send("♦")
        Case (Keys.C + Keys.Control)
            SendKeys.Send("♣")
    End Select
End Subcode
于 2021-02-19T13:43:42.510 回答