Ya tengoKeyPreview
conjunto 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
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
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