Langage

Comment gérer les messages d’entrée au clavier dans le formulaire

Windows Forms permet de gérer les messages clavier au niveau du formulaire, avant que les messages atteignent un contrôle. Cet article explique comment effectuer cette tâche.

Gérer un message clavier

Gérez l’événement KeyPress ou KeyDown du formulaire actif et définissez la propriété KeyPreview du formulaire sur true. Cette propriété amène l’entrée du clavier à atteindre le formulaire avant qu’elle n’atteigne les contrôles du formulaire. L’exemple de code suivant gère l’événement KeyPress en détectant toutes les clés numériques et en consommant 1, 4et 7.

// Detect all numeric characters at the form level and consume 1, 4, and 7.
// Form.KeyPreview must be set to true for this event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (char.IsDigit(e.KeyChar))
    {
        MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.");

        switch (e.KeyChar)
        {
            case '1':
            case '4':
            case '7':
                MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.");
                e.Handled = true;
                break;
        }
    }
}
' Detect all numeric characters at the form level and consume 1, 4, and 7.
' Form.KeyPreview must be set to true for this event handler to be called.
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs)
    If Char.IsDigit(e.KeyChar) Then
        MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.")

        Select Case e.KeyChar
            Case "1"c, "4"c, "7"c
                MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.")
                e.Handled = True
        End Select
    End If

End Sub

Quand KeyPreview n’est pas suffisant

Le paramètre Form.KeyPreview = true ne garantit pas que chaque clé atteint les gestionnaires d’événements au niveau du formulaire. Certaines touches font l’objet d’un prétraitement avant le déclenchement des événements de formulaire standard. La compréhension de ces exceptions est importante pour gérer correctement les clés de commande, les clés de dialogue et les entrées spécifiques au contrôle.

Prétraitement des touches de commande et de boîte de dialogue

Avant que les événements de clavier au niveau du formulaire ne se déclenchent, Windows prétraite certaines touches via ces méthodes (dans l’ordre) :

  1. ProcessCmdKey: intercepte les touches de commande telles que les raccourcis de menu et les accélérateurs. Si cette méthode renvoie true, la clé est consommée et aucun événement n’est déclenché.
  2. IsInputKey: détermine si une clé doit déclencher un KeyDown événement ou accéder à ProcessDialogKey.
  3. ProcessDialogKey : gère les touches de navigation (Échap, Tabulation, Retour et flèches). En cas de traitement, aucun événement ne se déclenche.

Si un contrôle ciblé consomme une clé pendant le prétraitement, le formulaire ne le reçoit jamais, indépendamment de KeyPreview.

Cas spéciaux qui contournent les gestionnaires au niveau du formulaire

  • Entrée et échappement : ces clés peuvent être gérées par AcceptButton et CancelButton avant d’atteindre les événements de formulaire.
  • Onglet : souvent consommé par la gestion du focus de contrôle et n’atteint pas les gestionnaires de formulaires.
  • Raccourcis du menu : les combinaisons de touches Alt sont gérées par le prétraitement du menu.

Intercepter les touches de commande au niveau du formulaire

Pour gérer les touches de commande (y compris les raccourcis de menu et les touches de boîte de dialogue) au niveau du formulaire, redéfinissez ProcessCmdKey dans votre formulaire. Cela s’exécute pendant le prétraitement, avant les événements de formulaire standard.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // Intercept Ctrl+A for custom handling
    if (keyData == (Keys.Control | Keys.A))
    {
        MessageBox.Show("Ctrl+A intercepted at form level");
        return true; // Mark as handled
    }

    // Pass other keys to the base handler
    return base.ProcessCmdKey(ref msg, keyData);
}
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
    ' Intercept Ctrl+A for custom handling
    If keyData = (Keys.Control Or Keys.A) Then
        MessageBox.Show("Ctrl+A intercepted at form level")
        Return True ' Mark as handled
    End If

    ' Pass other keys to the base handler
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

Pour les touches qui doivent déclencher des événements standard dans un contrôle spécifique, utilisez PreviewKeyDown avec IsInputKey défini sur true pour ce contrôle.

Voir aussi