2009-10-22 21 views
6

Ya tengoKeyPreviewconjunto de cierto en las propiedades del formulario¿El evento KeyDown no se activa con .NET WinForms?

Estoy trabajando en un pequeño programa, y ​​estoy teniendo un problema en el que parece que algunos de los controles en él groupboxes interiores son no activando el evento KeyDown en mi formulario cuando presiono y suelto cualquier tecla de flecha, solo el evento KeyUp. ¿Hay algo mal con mi código que pueda estar causando esto?

En concreto, después de haber habilitado TeclaDePresentaciónPreliminar en el formulario, y establecer puntos de interrupción en e.SuppressKeyPress = True en los dos subrutinas, y sólo el uno para frmMain_KeyUp golpea el punto de interrupción.

Agregué en los dos eventos de GroupBox esperando que podría mitigar el problema, pero no tuve tanta suerte. Sin embargo, tengo un control personalizado en el formulario que está codificado específicamente para ignorar estas pulsaciones de teclas, y el código funciona como se espera en él.

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 

El código en el control de usuario que "ignora" las pulsaciones de teclas es como tal:

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

establece un punto de interrupción en el código del control que lo ignora y ver si se dispara al menos una vez – curtisk

+0

con 'e.SuppressKeyPress = true' uncommented en el frmMain KeyDown handler, nunca se llama a la subrutina TileDropDown_KeyDown. Con esto comentó, el controlador * es * llamado. – Sukasa

Respuesta

8

Algunos controles interceptar las teclas de flecha en el evento KeyDown, pero no en el caso keyup. Una solución es derivar la clase de control y anular 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

Esto funcionó perfectamente, gracias! – Sukasa

Cuestiones relacionadas