Comment modifier les événements de touches clavier (Windows Forms .NET)

Windows Forms offre la possibilité de consommer et de modifier l'entrée au clavier. L’utilisation d’une clé fait référence à la gestion d’une clé au sein d’une méthode ou d’un gestionnaire d’événements afin que d’autres méthodes et événements plus bas dans la file d’attente de messages ne reçoivent pas la valeur de la clé. Et, la modification d’une clé fait référence à la modification de la valeur d’une clé afin que les méthodes et les gestionnaires d’événements plus bas dans la file d’attente de messages reçoivent une valeur de clé différente. Cet article explique comment effectuer ces tâches.

Important

La documentation du Guide du bureau pour .NET 7 et .NET 6 est en cours de construction.

Consommer une clé

Dans un gestionnaire d'événements KeyPress, affectez la valeur true à la propriété Handled de la classe KeyPressEventArgs.

-ou-

Dans un gestionnaire d'événements KeyDown, affectez la valeur true à la propriété Handled de la classe KeyEventArgs.

Remarque

La définition de la propriété Handled dans le gestionnaire d'événements KeyDown n'empêche pas les événements KeyPress et KeyUp d'être déclenchés pour la séquence de touches actuelle. Vous devez pour cela utiliser la propriété SuppressKeyPress.

L’exemple suivant gère l’événement KeyPress pour consommer les clés de caractères et a les A touches de caractères. Ces clés ne peuvent pas être tapées dans la zone de texte :

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

Modifier une clé de caractère standard

Dans un gestionnaire d'événements KeyPress, affectez à la propriété KeyChar de la classe KeyPressEventArgs la valeur de la nouvelle touche de caractère.

L’exemple suivant gère l’événement KeyPress pour modifier les clés de caractères et a les A touches de caractères en !:

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

Modifier une clé non caractère

Vous ne pouvez modifier que les appuis sur les touches autres que les caractères en héritent du contrôle et en substituant la PreProcessMessage méthode. À mesure que l’entrée Message est envoyée au contrôle, elle est traitée avant le déclenchement des événements. Vous pouvez intercepter ces messages pour les modifier ou les bloquer.

L’exemple de code suivant montre comment utiliser la WParam propriété du Message paramètre pour modifier la touche enfoncée. Ce code détecte une clé de F1 à F10 et convertit la clé en clé numérique comprise entre 0 et 9 (où F10 correspond à 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

Voir aussi