miércoles, 1 de julio de 2020

Captura de eventos de teclado

Es habitual el desarrollo de aplicaciones que, en algún momento, tengamos que controlar los eventos de teclado. Lo más habitual es tener que controlar la pulsación de alguna tecla para realizar alguna tarea, o simplemente para actuar como atajos de teclado para poder realizar acciones comunes de un modo más ágil.
Para detectar las pulsaciones realizadas dentro de un determinado control debemos definir las operaciones a realizar dentro del manejador del evento correspondiente (keydown, keyup, keypress, etc.) para ese control.

Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        If e.KeyChar >= ChrW(48) And e.KeyChar <= ChrW(57) Then
            MessageBox.Show(("TextBox.KeyPress: '" +
                e.KeyChar.ToString() + "' pulsado."))
            Select Case e.KeyChar
                Case ChrW(49), ChrW(57)
                    MessageBox.Show(("TextBox.KeyPress: '" +
                        e.KeyChar.ToString() + "' absorbido."))
                    e.Handled = True
            End Select
        End If
    End Sub

Sin embargo, si queremos detectar la pulsación de las teclas en el formulario debemos hacer algunas modificaciones. En primer lugar, debemos poner a True la propiedad KeyPreview del formulario. Además, debemos definir el código de las acciones a realizar en el manejador de eventos del formulario. De este modo, las teclas pulsadas serán detectadas primero por el formulario y después se pasarán a los distintos controles, salvo que dentro del manejador del evento correspondiente se defina la propiedad e.Handled = true.

Sub Form1_KeyPress(ByVal sender As Object,  ByVal e As KeyPressEventArgs) Handles Me.KeyPress
...
End Sub

Incluso haciendo estos ajustes existen casos en los que las teclas no alfanuméricas pueden no ser detectadas. Para estos casos es recomendable sobreescribir la función ProcessCmdKey. En este caso no es necesario establecer la propiedad del formulario KeyPreview a True. Si esta función devuelve True el evento detectado será consumido por esta función y no será recibido por el control que tenga el foco en ese momento.

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    If keyData = Keys.Up Then
        MessageBox.Show("Flecha arriba pulsada")
        Return True
    End If
    If keyData = Keys.Down Then
        MessageBox.Show("Flecha abajo pulsada")
        Return True
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

No hay comentarios:

Publicar un comentario