2009-10-22 21 views
6

mam jużKeyPreviewwartość true w właściwości formularzaZdarzenie KeyDown nie jest uruchamiane przy użyciu programu .NET WinForms?

pracuję nad małym programem, i mam problem, gdzie wydaje się, że niektóre z kontrolami na nim są wewnątrz groupboxes nie wyzwalanie zdarzenia KeyDown w moim formularzu po naciśnięciu i zwolnieniu dowolnego klawisza ze strzałką, tylko zdarzenie KeyUp. Czy coś jest nie tak z moim kodem, który może być przyczyną tego?

W szczególności włączyłem KeyPreview w formularzu i ustawiłem punkty przerwania na e.SuppressKeyPress = True w obu podprogramach, a tylko ten dla frmMain_KeyUp trafił w punkt przerwania.

Dodałem w dwóch zdarzeniach GroupBox, mając nadzieję, że może to złagodzić problem, ale bez takiego szczęścia. Mam jednak niestandardową kontrolę nad formularzem, który jest specjalnie zakodowany, aby zignorować te klawisze, a kod działa zgodnie z oczekiwaniami.

Private Sub frmMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown, GroupBox1.KeyDown, GroupBox2.KeyDown 
     e.SuppressKeyPress = True 
     Select Case e.KeyCode 
      Case Keys.Left 
       ScrollDir = ScrollDir Or 1 
      Case Keys.Right 
       ScrollDir = ScrollDir Or 2 
      Case Keys.Down 
       ScrollDir = ScrollDir Or 4 
      Case Keys.Up 
       ScrollDir = ScrollDir Or 8 
      Case Else 
       e.SuppressKeyPress = False 
     End Select 
     tScroll.Enabled = True 
     tScroll_Tick(Nothing, Nothing) 
    End Sub 

    Private Sub frmMain_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp, GroupBox1.KeyUp, GroupBox2.KeyUp 

     e.SuppressKeyPress = True 
     Select Case e.KeyCode 
      Case Keys.Left 
       ScrollDir = ScrollDir And (Not 1) 
      Case Keys.Right 
       ScrollDir = ScrollDir And (Not 2) 
      Case Keys.Down 
       ScrollDir = ScrollDir And (Not 4) 
      Case Keys.Up 
       ScrollDir = ScrollDir And (Not 8) 
      Case Else 
       e.SuppressKeyPress = False 
     End Select 
     If ScrollDir = 0 Then tScroll.Enabled = False 
    End Sub 

Kod w kontroli użytkownika, które „ignoruje” naciśnięć klawiszy jest jako takie:

Private Sub TileDropDown_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
     If e.KeyValue = 40 OrElse e.KeyValue = 38 OrElse e.KeyValue = 39 OrElse e.KeyValue = 37 Then 

      e.SuppressKeyPress = True 
     End If 
    End Sub 
+0

ustawić punkt przerwania w kodzie sterowania, który ignoruje go i zobacz czy odpala przynajmniej raz – curtisk

+0

Z 'e.SuppressKeyPress = TRUE odkomentowane w frmMain KeyDown handler, podprogram TileDropDown_KeyDown nigdy nie jest wywoływany. Po skomentowaniu, program obsługi * jest * wywoływany. – Sukasa

Odpowiedz

8

Niektóre kontrole przechwytywania klawiszy strzałek w keyDown, ale nie w przypadku keyup. Jednym z rozwiązań jest czerpać klasę sterowania i zastąpić ProcessCmdKey:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keydata As Keys) As Boolean 

If keydata = Keys.Right Or keydata = Keys.Left Or keydata = Keys.Up Or keydata = Keys.Down Then 
    OnKeyDown(New KeyEventArgs(keydata)) 
    ProcessCmdKey = True 
Else 
    ProcessCmdKey = MyBase.ProcessCmdKey(msg, keydata) 
    End If 
End Function 
+0

To działało idealnie, dzięki! – Sukasa

Powiązane problemy