1

我希望能够在应用程序加载时按住一个键,并根据被按住的键显示某种形式。

例如按住 shift 并打开 iTunes 会打开一个小对话框,允许您设置库(或其他东西)

我可以检查 shift/Ctrl/Alt 是否被按住,但我更喜欢使用字母/数字。

比如按住1打开Form1,按住2打开Form 2。

4

2 回答 2

2

如果您想在传统的 winform 上执行此操作,可以查看这篇文章:

http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state

大约一半的地方有一个抽象的键盘类,它使用系统调用来获取键状态。你可能想试一试。

编辑:这是转换为 VB.NET 的类。我没有测试它,所以可能会有一些错误。让我知道。

Imports System
Imports System.Windows.Forms
Imports System.Runtime.InteropServices

Public MustInherit Class Keyboard

    <Flags()>
    Private Enum KeyStates
        None = 0
        Down = 1
        Toggled = 2
    End Enum

    <DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)>
    Private Shared Function GetKeyState(ByVal keyCode As Integer) As Short
    End Function

    Private Shared Function GetKeyState(ByVal key As Keys) As KeyStates
        Dim state = KeyStates.None

        Dim retVal = GetKeyState(CType(key, Integer))

        ' if the high-order bit is 1, the key is down
        ' otherwise, it is up
        If retVal And &H8000 = &H8000 Then
            state = state Or KeyStates.Down
        End If

        ' If the low-order bit is 1, the key is toggled.
        If retVal And 1 = 1 Then
            state = state Or KeyStates.Toggled
        End If

        Return state
    End Function

    Public Shared Function IsKeyDown(ByVal key As Keys) As Boolean
        Return KeyStates.Down = (GetKeyState(key) And KeyStates.Down)
    End Function

    Public Shared Function IsKeyToggled(ByVal key As Keys) As Boolean
        Return KeyStates.Toggled = (GetKeyState(key) And KeyStates.Toggled)
    End Function

End Class

因此,一旦将此类添加到项目中,您就可以执行以下操作:

' See if the 1 button is being held down
If Keyboard.IsKeyDown(Keys.D1) Then
    ' Do the form showing stuff here
EndIf
于 2010-01-15T21:37:19.070 回答
1

如果您使用的是 WPF,则可以使用该Keyboard.GetKeyStates方法来确定个人的状态Key。例如

If KeyBoard.GetKeyStates(Key.D1) = KeyStates.Down Then
  ' Open Form1
End If

更多信息:

编辑

对于 WinForms,解决方案有点困难。我知道没有任何公开的方法可以为您提供Key枚举中的公开状态。相反,您必须 PInvoke 进入 Win32 GetKeyState 方法。

<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Public Shared Function GetKeyState(ByVal keyCode As Integer) As Short
End Function

对于大多数键,结果应该可以直接从Key值转换。

If NativeMethods.GetKeyState(CInt(Key.D1)) < 0 Then
  ' 1 is held down
End If
于 2010-01-15T21:32:18.180 回答