74 votes

Comment faire en sorte qu'un formulaire se ferme lorsqu'on appuie sur la touche Echap ?

J'ai un petit formulaire qui s'affiche lorsque j'appuie sur un bouton dans une application Windows Forms.

Je veux pouvoir fermer le formulaire en appuyant sur la touche Echap. Comment puis-je le faire ? Je ne suis pas sûr de l'événement à utiliser. form_closing ?

1 votes

Pour une solution alternative, voir la réponse de Hans Passant sur ce fil : stackoverflow.com/questions/2290959/

0 votes

134voto

ChrisF Points 74295

Vous pouvez définir une propriété sur le formulaire qui le fera pour vous si vous avez un bouton sur le formulaire qui ferme déjà le formulaire.

Définissez le CancelButton du formulaire à ce bouton.

Obtient ou définit le contrôle du bouton sur lequel on clique lorsque l'utilisateur appuie sur la touche Esc clé.

Si vous ne disposez pas d'un bouton d'annulation, vous devrez ajouter un bouton de type KeyDown et vérifiez la présence de la touche Esc dans ce gestionnaire :

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Escape)
    {
        this.Close();
    }
}

Vous devrez également définir le KeyPreview à true.

Obtient ou définit une valeur indiquant si le formulaire doit recevoir les événements de touche avant que l'événement ne soit transmis au contrôle qui a le focus.

Cependant, comme le souligne Gargo dans son réponse cela signifie qu'en appuyant sur Esc pour interrompre une modification sur un contrôle dans la boîte de dialogue aura également pour effet de fermer la boîte de dialogue. Pour éviter cela, remplacez l'option ProcessDialogKey comme suit :

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

2 votes

C'est dommage que le simple fait d'ajouter un bouton caché (visible=true) ne fonctionne pas.

4 votes

Du point de vue du traitement, l'ajout d'un bouton caché pour cela serait de toute façon une solution vraiment sale, puisque dans les deux cas, le formulaire aura en interne un écouteur de clé pour le faire fonctionner. Il n'est pas nécessaire de créer un objet bouton inutile juste pour appeler la fonction liée à son écouteur Clicked.

0 votes

@SergeWautier Vous avez raison, mais la réponse de kkkppps est la solution à ce problème.

33voto

Gargo Points 501

Le meilleur moyen que j'ai trouvé est de remplacer la fonction "ProcessDialogKey". De cette façon, l'annulation d'un contrôle ouvert reste possible car la fonction n'est appelée que si aucun autre contrôle n'utilise la touche pressée.

Il s'agit du même comportement que lors de la mise en place d'un CancelButton. L'utilisation de l'événement KeyDown se déclenche toujours et le formulaire se fermerait donc même s'il devait annuler l'édition d'un éditeur ouvert.

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

7voto

Will A Points 16763

Si votre formulaire comporte un bouton d'annulation, vous pouvez définir la propriété Form.CancelButton sur ce bouton et appuyer sur la touche Echap pour "cliquer sur le bouton".

Si vous ne disposez pas d'un tel bouton, consultez l'outil Formulaire.KeyPreview propriété.

5voto

kkkppp Points 1
Button cancelBTN = new Button();
cancelBTN.Size = new Size(0, 0);
cancelBTN.TabStop = false;
this.Controls.Add(cancelBTN);
this.CancelButton = cancelBTN;

0 votes

Cette réponse devrait être la bonne. Le bouton EST caché, mais la propriété "visible" n'est pas "false" et cela fonctionne comme un charme. Très bien !

0 votes

Je ne sais pas ça semble un peu "hacky" comme si on était revenu à l'époque de vb6.

0voto

simon Points 1

Collez ce code dans la propriété "On Key Down" de votre formulaire, assurez-vous également de définir la propriété "Key Preview" sur "Yes".

If KeyCode = vbKeyEscape Then DoCmd.Close acForm, "YOUR FORM NAME"

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