【问题标题】:Multiple non-modifier key event - VB.NET多个非修饰键事件 - VB.NET
【发布时间】:2014-06-11 12:29:42
【问题描述】:

有没有办法识别包含修饰符的多个按键组合?

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

所以我希望能够识别多键组合,例如 C + T - 不包括 Modifier。这可能吗?

【问题讨论】:

  • 由于 e.KeyCode 一次只能包含一个值,因此您必须跟踪前一个键以查看它是否等于“C”或“T”,当然清除当它不是“C”而不是“T”时按下前一个字符
  • @Plutonix 所以我猜没有像使用Modifiers 时那样的正确方法?哦,好吧,只是一个想法!

标签: .net vb.net keyboard-shortcuts


【解决方案1】:

老派的方式:

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} 将不起作用)。如果您需要这方面的帮助,请告诉我。

【讨论】:

    【解决方案2】:

    当然可以,GetKeyState():

    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As IntPtr) As Short
    

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

    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
    

    【讨论】:

    • 感谢您的回答!我是否正确假设括号中的数字是由 Visual Studio 简单地美化为Keys.Whatever 的实际参考数字?在这种情况下,您是否会因此将 84 用作 T 的代码,将 67 用作 C 的代码,这是官方数字吗?
    • 括号中的数字是System.Windows.Input.Key中提供的枚举
    • 我似乎无法访问System.Windows.Input.Key。我不建议这样做 - 这是 .NET 4.0 / Visual Studio 2010 Express 中不可用的功能吗? (我在跑什么)?
    • 检查这个问题:stackoverflow.com/a/14377813/1967056(我知道我以前回答过这个问题)
    • 是的,很抱歉没有在我使用的答案上单击接受。我很欣赏做出答案的努力,但我发现 Neolisk 的答案更清晰/更容易一些。如果您支持这个问题,我可以支持您的回答来表达我的感激之情。
    猜你喜欢
    • 2010-10-15
    • 2018-02-27
    • 2019-05-04
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多