VB 使用按键事件切换特定表单

VB toggle specific form with key press events

您好,当按下一组特定的键时,我无法显示表单。主窗体先运行;这是应该隐藏的第二种形式,直到通过按 ctrl+alt+shift+h 进行切换。这是我的代码,我相信它应该可以工作,但事实并非如此。我这样试过,在一个每 1 毫秒检查一次新闻事件的计时器中

Private Sub tmrKeys_Tick(sender As Object, e As EventArgs) Handles tmrKeys.Tick
    Dim key As String = Nothing

    If My.Computer.Keyboard.AltKeyDown AndAlso My.Computer.Keyboard.CtrlKeyDown AndAlso My.Computer.Keyboard.ShiftKeyDown AndAlso key = "H" Then
        Dim x = New form2()
        x.Show()
    End If
End Sub

而且我还尝试了这样一个单独的函数:

Private Sub form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.Control AndAlso e.Alt AndAlso e.Shift AndAlso e.KeyCode = Keys.H Then
        form2.Show()
    End If
End Sub

提前感谢您的帮助。

您的代码看起来不错(不需要计时器)。我认为您缺少的是 KeyPreviewTrue

的设置

When this property is set to true, the form will receive all KeyPress, KeyDown, and KeyUp events

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Form1.KeyPreview = True
End Sub

那么这应该可行:

Private Sub form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.Control AndAlso e.Alt AndAlso e.Shift AndAlso e.KeyCode = Keys.H Then
        form2.Show()
    End If 
End Sub

这就是我要找的。感谢@jmcilhinney 向 RegisterHotKey 提供有关如何注册活动热键的提示。此代码将热键设置为 alt+UPKEY。我想弄清楚如何修改参数以分配 2 个以上的键,例如 CTRL+ALT+SHIFT+UPKEY。但我必须去上班,所以今晚我会继续努力,明天为大家更新,除非有热心的海狸想在我工作的时候告诉我如何做,哈哈。再次感谢所有提供帮助的人!

Public Class Form1

Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
Public Const WM_HOTKEY As Integer = &H312


Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = WM_HOTKEY Then
        Form2.Show()
    End If

    MyBase.WndProc(m)

End Sub


Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Call UnregisterHotKey(Me.Handle, 9)

End Sub


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call RegisterHotKey(Me.Handle.ToInt32, 0, &H1, 38) '<-- registers specific hotkeys

End Sub
End Class