Partager via


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

Windows Forms permet d’utiliser et de modifier l’entrée du clavier. La consommation d'une clé renvoie à la gestion d'une clé au sein d'une méthode ou d'un gestionnaire d'événements, de sorte que d'autres méthodes et événements en aval 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.

Consommer une clé

Dans un gestionnaire d’événements KeyPress, définissez la propriété Handled de la classe KeyPressEventArgs sur true.

-ou-

Dans un gestionnaire d’événements KeyDown, définissez la propriété Handled de la classe KeyEventArgs sur true.

Note

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. Utilisez la propriété SuppressKeyPress à cet effet.

L’exemple suivant gère l’événement KeyPress pour consommer les clés de caractères A et a. 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, définissez la propriété KeyChar de la classe KeyPressEventArgs sur la valeur de la nouvelle clé de caractère.

L’exemple suivant gère l’événement KeyPress de manière à convertir les touches de caractères A et a 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 pressions sur les touches autres que les caractères en héritant du contrôle et en surchargeant la méthode PreProcessMessage. À mesure que l'entrée Message est envoyée au contrôleur, elle est traitée avant le déclenchement des événements par le contrôleur. Vous pouvez intercepter ces messages pour les modifier ou les bloquer.

L’exemple de code suivant montre comment utiliser la propriété WParam du paramètre Message 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 mappe à 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