我正在尝试检测在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语句来检测一个键或另一个键,但是当我尝试这个时,我真的没有得到任何东西。还有另一种方法吗?
由于
答案 0 :(得分:10)
首先,代码中的And
应为AndAlso
,因为它是一个逻辑运算符。 VB中的And
是一个位操作符。接下来,您可以使用Modifiers
property来测试修饰键:
If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Ctrl 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 …
在两个片段中,我们都使用了bit masks。
答案 1 :(得分: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
End Sub
答案 2 :(得分:2)
我遇到了同样的问题,但是要让我开始工作,我必须将表单 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
或上述答案中提供的其他程序逻辑。
答案 3 :(得分:1)
我现在没有安装vb.net但是在你的keydown或keypress事件上试试这个:
If e.KeyCode = Keys.T AndAlso e.Control = True Then
MsgBox("Ctrl + T")
End If
答案 4 :(得分:1)
我会从长码中拯救你。 这里:
If e.Control And e.Alt And e.KeyCode = Keys.G Then
MsgBox("Control Alt G")
End If
答案 5 :(得分:0)
我实际上通过实验发现,当通过我们添加到代码中的“KeyDown”或“KeyUp”例程处理代码时,KeyPreview 设置是无关紧要的。也许keypress的自动内置代码考虑了KeyPreview设置,但我们甚至不必考虑。
我发现最好的方法是 KuroMoro 的答案中显示的方法,使用 e.KeyData 加上各种“Case Statements”。 当某些键与 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