2015-12-08 3 views
1

У меня возникла странная проблема: я установил «горячую клавишу», чтобы показать и скрыть панель справки, и она работает, пока я не нажимаю кнопку закрытия (скрыть) на этой панели, после чего «горячая клавиша» больше не работает. Также у меня есть кнопка в моей форме, которая также показывает и скрывает эту панель, и она работает все время, это только проблема с «горячей клавишей».Панель не отображается после нажатия клавиши

Это то, что я сделал для «горячей клавиши».

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 = истина/ложь, как много раз я хочу, это только перестанет работать после того, как я нажимаю любую бутон на панели.

В конструкторе: в панели1 - Panel1.Visible = False

  • lblMenu
  • btnClose
  • btnReset
  • btnSettings
  • 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 

End Class

Это полный код я использовал

+0

У меня есть несколько форм, но они не используются в этом коде. Также эта форма является единственной, которая не включена внутри окна, так что это точно так же, как вы делаете новую форму. – Treno

+0

Хорошо, теперь я отправил вам полный код – Treno

+0

Да, я меняю его извините, я попробовал с разными ключами. Я собираюсь изменить его для H снова. Извините еще раз. – Treno

ответ

0

ОК, это как я заставить его работать

 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

0

При добавлении обработчика для всех остальных кнопок решает это для вас, то это в вашем коде :

Добавить обработчик для всех ваших кнопок, когда форма загружается следующим образом:

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 
+0

Кнопка на форме работает нормально, проблема с e.KeyCode после нажатия кнопки на панели – Treno

+0

Что происходит при отладке? –

+0

Список ошибок не дает мне никаких ошибок, предупреждений или сообщений, я также помещал их в Try Catch, но, как я уже сказал, это не вызывает никакой ошибки, просто ничего не происходит после нажатия клавиши – Treno

0

Я просто не верю, что это так просто, раньше я узнал, что это проблема фокусировки. Таким образом, код может быть примерно таким:

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