按键后面板不显示

Panel not shows after key pressed

我遇到了一个奇怪的问题,我设置了 "hotkey" 来显示和隐藏帮助面板,它一直有效,直到我按下该面板上的关闭(隐藏)按钮,然后 "hotkey"不再工作了。我的表单上还有一个按钮,也可以显示和隐藏该面板,并且它一直有效,这只是 "hotkey".

的问题

这就是我为"hotkey"所做的。

Private Sub Me_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.H Then
        If Panel1.Visible = True Then
            Panel1.Visible = False
        ElseIf Panel1.Visible = False Then
            Panel1.Visible = True
        End If
    End If
End Sub

但如果我只使用这个热键,我可以设置 visible = true/false 任意次数,它只会在我按下面板上的任何按钮后停止工作。

在设计视图中:在面板 1 中 - Panel1.Visible = 错误

更多代码:

Public Class Form1
Private Sub debug_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    lblMenu.Text = "Menu"
    Panel1.Visible = False
End Sub

Private Sub Me_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.H Then
        If Panel1.Visible = True Then
            Panel1.Visible = False
        ElseIf Panel1.Visible = False Then
            Panel1.Visible = True
        End If
    End If
End Sub

Private Sub btnResume_Click(sender As Object, e As EventArgs) Handles btnResume.Click
    If Panel1.Visible = True Then
        Panel1.Visible = False
    End If
End Sub

Private Sub btnRestart_Click(sender As Object, e As EventArgs) Handles btnRestart.Click
    'For restar configuration
End Sub

Private Sub btnSettings_Click(sender As Object, e As EventArgs) Handles btnSettings.Click
    'Display additional settings
End Sub

Private Sub btnExitToMenu_Click(sender As Object, e As EventArgs) Handles btnExitToMenu.Click
    Dim msg = "Are you sure you want exit to menu?"
    Dim response = MsgBox(msg, MsgBoxStyle.YesNo)
    If response = MsgBoxResult.Yes Then
        Me.Close()
    End If
End Sub

Private Sub btnExitGame_Click(sender As Object, e As EventArgs) Handles btnExitGame.Click
    Dim msg = "Are you sure you want to close this app?"
    Dim response = MsgBox(msg, MsgBoxStyle.YesNo)
    If response = MsgBoxResult.Yes Then
        Form1.Close()
    End If
End Sub

Private Sub btnMenu_Click(sender As Object, e As EventArgs) Handles btnMenu.Click
    If Panel1.Visible = True Then
        Panel1.Visible = False
    ElseIf Panel1.Visible = False Then
        Panel1.Visible = True
    End If
End Sub

结束Class

这是我使用的完整代码

如果为所有其他按钮添加处理程序可以为您解决问题,那么将其放入您的代码中:

像这样加载表单时为所有按钮添加处理程序:

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each cntl As Control In Me.Controls
            If TypeOf cntl Is Button Then
                AddHandler DirectCast(cntl, Button).Click, AddressOf HandleMyButtonClicksPlease
            End If
        Next
    End Sub

 Private Sub HandleMyButtonClicksPlease(ByVal sender As System.Object, ByVal e As System.EventArgs)
       If Panel1.Visible = True Then
            Panel1.Visible = False
        ElseIf Panel1.Visible = False Then
            Panel1.Visible = True
        End If
    End Sub

好的,这就是我的工作方式

        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
                TextBox1.Text = m.LParam '<-- 2. After you run the form press the key you set in 1. and copy it
            End If
            If m.LParam = 4718592 Then  '<-- 3. paste this here to use wanted key
                    If Panel1.Visible = True Then
                        Panel1.Visible = False
                    ElseIf Panel1.Visible = False Then
                        Panel1.Visible = True
                    End If
            End If
            MyBase.WndProc(m)
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Call RegisterHotKey(Me.Handle, 9, 0, Keys.H) '<-- 1. Add a key what you want to use
        End Sub

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

感谢 tezzo

我只是不相信这么简单,早些时候我发现这是一个焦点问题。所以代码可以是这样的:

    Private Sub Me_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus
        Me.Focus()
    End Sub