96 votes

Bouton d'échappement pour fermer un formulaire Windows Forms en C#

J'ai essayé ce qui suit :

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if ((Keys) e.KeyValue == Keys.Escape)
        this.Close();
}

Mais ça ne marche pas.

Puis j'ai essayé ça :

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Escape)
        this.Close();
}

Et toujours rien ne fonctionne.

Le KeyPreview des propriétés de mon formulaire Windows Forms est réglé sur true... Qu'est-ce que je fais de travers ?

1 votes

Avez-vous essayé de mettre un point d'arrêt dans ces méthodes ? Le gestionnaire d'événements se déclenche-t-il ?

1 votes

Ne nommez pas votre bouton d'annulation comme la propriété du formulaire "CancelButton". Sinon, il semble que vous ne puissiez pas définir le bouton d'annulation.

0 votes

@SteveDanner, l'événement ne se déclenche pas. Il manque probablement la déclaration dans InitializeComponent().

203voto

Hans Passant Points 475940

Cela fonctionnera toujours, indépendamment de l'affectation correcte des gestionnaires d'événements, KeyPreview , CancelButton etc :

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (keyData == Keys.Escape) {
        this.Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

10 votes

-1, l'utilisation de la propriété CancelButton du formulaire est la bonne méthode.

14 votes

Ugh, les années 80 ont appelé, ils veulent récupérer leur boîte de dialogue.

1 votes

Vous pouvez également renvoyer true de ProcessCmdKey pour signaler que la clé est manipulée, ce qui évite le bruit du "ding".

65voto

Shawn Steward Points 4632

Vous devriez être en mesure de définir les paramètres du formulaire. CancelButton à votre bouton d'annulation et vous n'aurez pas besoin de code.

3 votes

J'ai fait ça mais ça ne se déclenche pas quand j'appuie sur esc, pourquoi ?

0 votes

Cela a bien fonctionné pour moi. Beaucoup mieux pour les petits formulaires.

0 votes

Gardez à l'esprit que le bouton que vous définissez CancelButton doit être visible.

16voto

Adam Robinson Points 88472

En supposant que vous disposez d'un bouton "Annuler", la définition de l'élément de formulaire CancelButton (soit dans le concepteur, soit dans le code) devrait s'en charger automatiquement. Il suffit de placer le code de fermeture dans la propriété Click du bouton.

9voto

Joel Points 1531

La réponse acceptée est en effet correcte, et j'ai utilisé cette approche à plusieurs reprises. Soudain, cela ne fonctionnait plus, et j'ai trouvé cela étrange. Principalement parce que mon point d'arrêt ne serait pas atteint pour ESC mais il frappe pour d'autres touches.

Après avoir débogué, j'ai découvert que l'un des contrôles de mon formulaire surchargeait les paramètres suivants ProcessCmdKey avec ce code :

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // ...
    if (keyData == (Keys.Escape))
    {
        Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

... et cela empêchait mon formulaire d'obtenir le message ESC (remarquez le return true ). Assurez-vous donc qu'aucun contrôle enfant ne s'empare de vos données.

0 votes

De mémoire, je ne suis pas sûr qu'il faille définir le formulaire KeyPreview sur true -. msdn.microsoft.com/fr/us/library/

0 votes

Il semble que je rencontre ce problème avec les contrôles ListView de ma plateforme Winform. Je me demande si c'est aussi avec le ListView que vous avez rencontré le problème ?

-1voto

SwDevMan81 Points 22634

Par bouton Escape, voulez-vous dire la touche Escape ? À en juger par votre code, je pense que c'est ce que vous voulez. Vous pouvez également essayer Application.Exit(), mais Fermer devrait fonctionner. Avez-vous un fil de travail ? Si un thread qui n'est pas en arrière-plan est en cours d'exécution, cela pourrait maintenir l'application ouverte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X