Langage
Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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) :
-
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é. - IsInputKey: détermine si une clé doit déclencher un KeyDown événement ou accéder à ProcessDialogKey.
- 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
.NET Desktop feedback