Condividi tramite


Come modificare gli eventi dei tasti della tastiera (Windows Forms .NET)

Windows Form consente di utilizzare e modificare l'input da tastiera. La consumazione di una chiave si riferisce alla sua gestione all'interno di un metodo o di un gestore eventi, in modo tale da impedire che altri metodi ed eventi più in basso nella coda dei messaggi ricevano il valore della chiave. Inoltre, la modifica di una chiave si riferisce alla modifica del valore di una chiave in modo che i metodi e i gestori eventi più in basso nella coda dei messaggi ricevano un valore di chiave diverso. Questo articolo illustra come eseguire queste attività.

Utilizzare una chiave

In un gestore eventi KeyPress, impostare la proprietà Handled della classe KeyPressEventArgs su true.

-o-

In un gestore eventi KeyDown, impostare la proprietà Handled della classe KeyEventArgs su true.

Nota

L'impostazione della proprietà Handled nel gestore eventi KeyDown non impedisce la generazione degli eventi KeyPress e KeyUp per la sequenza di tasti corrente. Utilizzare la proprietà SuppressKeyPress a questo scopo.

Nell'esempio seguente, viene gestito l'evento KeyPress per consumare i tasti carattere A e a. Tali chiavi non possono essere digitate nella casella di testo:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a' || e.KeyChar == 'A')
        e.Handled = true;
}
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
    If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
        e.Handled = True
    End If
End Sub

Modificare un tasto di carattere standard della tastiera

In un gestore eventi KeyPress impostare la proprietà KeyChar della classe KeyPressEventArgs sul valore della nuova chiave di carattere.

Nell'esempio seguente, viene gestito l'evento KeyPress per modificare qualsiasi tasto dei caratteri A e a in !.

private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'a' || e.KeyChar == 'A')
    {
        e.KeyChar = '!';
        e.Handled = false;
    }
}
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs)
    If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
        e.KeyChar = "!"c
        e.Handled = False
    End If
End Sub

Modificare una chiave non di caratteri

È possibile modificare solo i tasti non di carattere ereditando dal controllo ed eseguendo l'override del metodo PreProcessMessage. Quando l'input Message viene inviato al controllo, viene elaborato prima che il controllo generi eventi. È possibile intercettare questi messaggi per modificarli o bloccarli.

Nell'esempio di codice seguente viene illustrato come utilizzare la proprietà WParam del parametro Message per modificare il tasto premuto. Questo codice rileva una chiave da F1 F10 e converte la chiave in una chiave numerica compresa tra 0 e 9 (dove F10 esegue il mapping a 0).

public override bool PreProcessMessage(ref Message m)
{
    const int WM_KEYDOWN = 0x100;

    if (m.Msg == WM_KEYDOWN)
    {
        Keys keyCode = (Keys)m.WParam & Keys.KeyCode;

        // Detect F1 through F9.
        m.WParam = keyCode switch
        {
            Keys.F1 => (IntPtr)Keys.D1,
            Keys.F2 => (IntPtr)Keys.D2,
            Keys.F3 => (IntPtr)Keys.D3,
            Keys.F4 => (IntPtr)Keys.D4,
            Keys.F5 => (IntPtr)Keys.D5,
            Keys.F6 => (IntPtr)Keys.D6,
            Keys.F7 => (IntPtr)Keys.D7,
            Keys.F8 => (IntPtr)Keys.D8,
            Keys.F9 => (IntPtr)Keys.D9,
            Keys.F10 => (IntPtr)Keys.D0,
            _ => m.WParam
        };
    }

    // Send all other messages to the base method.
    return base.PreProcessMessage(ref m);
}
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean

    Const WM_KEYDOWN = &H100

    If m.Msg = WM_KEYDOWN Then
        Dim keyCode As Keys = CType(m.WParam, Keys) And Keys.KeyCode

        Select Case keyCode
            Case Keys.F1 : m.WParam = CType(Keys.D1, IntPtr)
            Case Keys.F2 : m.WParam = CType(Keys.D2, IntPtr)
            Case Keys.F3 : m.WParam = CType(Keys.D3, IntPtr)
            Case Keys.F4 : m.WParam = CType(Keys.D4, IntPtr)
            Case Keys.F5 : m.WParam = CType(Keys.D5, IntPtr)
            Case Keys.F6 : m.WParam = CType(Keys.D6, IntPtr)
            Case Keys.F7 : m.WParam = CType(Keys.D7, IntPtr)
            Case Keys.F8 : m.WParam = CType(Keys.D8, IntPtr)
            Case Keys.F9 : m.WParam = CType(Keys.D9, IntPtr)
            Case Keys.F10 : m.WParam = CType(Keys.D0, IntPtr)
        End Select
    End If

    Return MyBase.PreProcessMessage(m)
End Function

Vedere anche