按键后面板不显示
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 = 错误
- lblMenu
- btn关闭
- btn重置
- btn设置
- btnExitToMenu
- btnExitApp
更多代码:
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
我遇到了一个奇怪的问题,我设置了 "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 = 错误
- lblMenu
- btn关闭
- btn重置
- btn设置
- btnExitToMenu
- btnExitApp
更多代码:
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