Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个非修改器键事件-VB.NET_.net_Vb.net_Keyboard Shortcuts - Fatal编程技术网

多个非修改器键事件-VB.NET

多个非修改器键事件-VB.NET,.net,vb.net,keyboard-shortcuts,.net,Vb.net,Keyboard Shortcuts,有没有一种方法可以识别多个按键组合不包含修饰语 我知道检测和使用Modifier+Normal key组合的方法-在MyBase.KeyDown事件下,e.KeyCode提供与每个键盘字母相关的数字。我知道如何通过使用e.Modifier和键组合这些 因此,我希望能够识别一个多键组合,例如C+T——它不包括修饰符。这可能吗?当然,您可以: 然后,例如,控制要检查是否按下的每个键: Dim keypressed As Keys If GetKeyState(87) < 0 OrElse

有没有一种方法可以识别多个按键组合不包含修饰语

我知道检测和使用
Modifier
+
Normal key
组合的方法-在
MyBase.KeyDown
事件下,
e.KeyCode
提供与每个键盘字母相关的数字。我知道如何通过使用
e.Modifier
键组合这些

因此,我希望能够识别一个多键组合,例如
C
+
T
——它不包括
修饰符。这可能吗?

当然,您可以:

然后,例如,控制要检查是否按下的每个键:

Dim keypressed As Keys 

If GetKeyState(87) < 0 OrElse GetKeyState(38) < 0 Then : keypressed = Keys.Up 
ElseIf GetKeyState(65) < 0 OrElse GetKeyState(37) < 0 Then : keypressed = Keys.Left 
ElseIf GetKeyState(68) < 0 OrElse GetKeyState(39) < 0 Then : keypressed = Keys.Right 
ElseIf GetKeyState(83) < 0 OrElse GetKeyState(40) < 0 Then : keypressed = Keys.Down 
Else : keypressed = Nothing
End If
Dim键作为按键按下
如果GetKeyState(87)小于0或GetKeyState(38)小于0,则:keypressed=Keys.Up
ElseIf GetKeyState(65)<0或Else GetKeyState(37)<0然后:按键按下=按键。左
ElseIf GetKeyState(68)<0或Else GetKeyState(39)<0然后:按键按下=按键。右
ElseIf GetKeyState(83)<0或Else GetKeyState(40)<0然后:按键按下=按键。向下
否则:按键=无
如果结束
老派的方式:

Public Class Form1

  Dim combination As New List(Of Keys)({Keys.T, Keys.C})
  Dim currentKeys As New List(Of Keys)

  Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    currentKeys.Add(e.KeyCode)
    If currentKeys.Intersect(combination).Count = combination.Count Then
      'this is our combo
      MessageBox.Show("Fatality!")
      currentKeys.Clear()
    End If
  End Sub

  Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    currentKeys.Remove(e.KeyCode)
  End Sub

End Class

如果同时按下C和T,则会触发此操作,但如果单独按下,则不会触发此操作。当{C,T}和其他字母压在中间时(包括{C,T}的任何组合)。您可以将其修改为仅在按下{C,T}时触发(例如,{C,T,X}将不起作用)。如果您需要帮助,请告诉我。

由于e.KeyCode一次只能包含一个值,因此您必须跟踪上一个键以查看它是否等于“C”或“T”,当然,如果不是“C”或“T”,请清除上一个按下的字符@所以我猜没有合适的方法像使用
修饰符时那样?哦,好吧,只是个主意!谢谢你的回答!我是否正确地假设括号中的数字是Visual Studio简单地美化为
键的实际参考号。
随便什么?在这种情况下,您会使用84作为
T
的代码,使用67作为
C
的代码吗?括号中的数字是
System.Windows.Input.Key
中提供的枚举。我似乎无法访问
System.Windows.Input.Key
。我不建议这样做-这是.NET4.0/VisualStudio2010Express中没有的功能吗?(我在运行什么)?检查此问题:(我知道我以前已经回答过)是的,很抱歉没有单击我使用的答案上的“接受”。我很感谢你的努力,但我发现Neolik的答案更清楚/更容易。如果你对这个问题投赞成票,我可以对你的回答投反对票以表示我的感激。
Public Class Form1

  Dim combination As New List(Of Keys)({Keys.T, Keys.C})
  Dim currentKeys As New List(Of Keys)

  Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    currentKeys.Add(e.KeyCode)
    If currentKeys.Intersect(combination).Count = combination.Count Then
      'this is our combo
      MessageBox.Show("Fatality!")
      currentKeys.Clear()
    End If
  End Sub

  Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    currentKeys.Remove(e.KeyCode)
  End Sub

End Class