Come modificare gli eventi dei tasti di tastiera (Windows Form .NET)

Windows Forms permette di usare e modificare l'input da tastiera. L'utilizzo di una chiave si riferisce alla gestione di una chiave all'interno di un metodo o di un gestore eventi in modo che altri metodi ed eventi più in basso nella coda dei messaggi non 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à.

Importante

La documentazione di Desktop Guide per .NET 7 e .NET 6 è in fase di costruzione.

Utilizzare una chiave

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

-oppure-

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 attuale. Usare la proprietà SuppressKeyPress per questo scopo.

Nell'esempio seguente viene gestito l'evento KeyPress per utilizzare le A chiavi di carattere 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 carattere standard

In un gestore eventi KeyPress impostare la proprietà KeyChar della classe KeyPressEventArgs sul valore del nuovo tasto carattere.

Nell'esempio seguente viene gestito l'evento KeyPress per modificare qualsiasi A chiave di carattere 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 PreProcessMessage metodo . Quando l'input Message viene inviato al controllo, viene elaborato prima che il controllo genera eventi. È possibile intercettare questi messaggi per modificarli o bloccarli.

Nell'esempio di codice seguente viene illustrato come utilizzare la WParam proprietà del Message parametro per modificare il tasto premuto. Questo codice rileva una chiave da F1 a 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

Vedi anche