Bouton Échap pour fermer le formulaire Windows Forms en C #

91

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.

Ensuite, j'ai essayé ceci:

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

Et toujours rien ne fonctionne.

Le KeyPreview sur mes propriétés de formulaire Windows Forms est défini sur true ... Qu'est-ce que je fais mal?

yeahumok
la source
1
Avez-vous essayé de définir un point d'arrêt dans ces méthodes? Le gestionnaire d'événements se déclenche-t-il même?
Steve Danner
1
Ne nommez pas votre bouton d'annulation comme la propriété de formulaire «CancelButton». Sinon, il semble que vous ne puissiez pas définir le CancelButton.
Jonas Middendorf
@SteveDanner, l'événement ne se déclenche pas. probablement une déclaration dans InitializeComponent () est manquante.
InfantPro'Aravind '12
Je pense que la raison pour laquelle cela ne fonctionne pas est parce que d'autres contrôles à l'intérieur du formulaire ont le focus ...
itsho

Réponses:

199

Cela fonctionnera toujours, quelle que soit l'affectation appropriée du gestionnaire 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);
    }
Hans Passant
la source
10
-1, l'utilisation de la propriété CancelButton de Form est le bon moyen.
ABCD
14
Ugh, les années 1980 ont appelé, ils veulent récupérer leur boîte de dialogue.
Hans Passant
1
Vous pouvez également revenir truede à ProcessCmdKeypour signaler que la clé est gérée, évitant ainsi le bruit "ding".
Spooky
8
Vous ne pouvez utiliser une propriété CancelButton du formulaire que si le formulaire contient un Button réel (ou un objet d'interface IButtonControl).
David
3
Cette option est bonne. CancelButton nécessite un bouton 'Annuler' visible supplémentaire sur le formulaire. Ceci est redondant render + code + etc
V319
64

Vous devriez simplement pouvoir définir la CancelButtonpropriété du formulaire sur votre bouton Annuler et vous n'aurez besoin d'aucun code.

Shawn Steward
la source
2
J'ai fait ça mais ça ne se déclenche pas quand j'appuie sur esc, pourquoi?
Mihai Bratulescu
Cela a très bien fonctionné pour moi. Beaucoup mieux pour les petites formes.
knut le
15

En supposant que vous ayez un bouton "Annuler", la définition de la CancelButtonpropriété du formulaire (soit dans le concepteur, soit dans le code) devrait s'en occuper automatiquement. Placez simplement le code à fermer en Clickcas de bouton.

Adam Robinson
la source
9

La réponse acceptée est en effet correcte, et j'ai utilisé cette approche à plusieurs reprises. Soudain, cela ne fonctionnait plus, alors j'ai trouvé cela étrange. Surtout parce que mon point d'arrêt ne serait pas touché pour la ESCclé, mais il frapperait pour d'autres clés.

Après le débogage, j'ai découvert que l'un des contrôles de mon formulaire remplaçait la ProcessCmdKeyméthode, 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 la ESCclé (remarquez le return true). Assurez-vous donc qu'aucun contrôle enfant ne reprend votre entrée.

Joël
la source
Du haut de ma tête, je ne sais pas si vous devez définir le formulaire KeyPreview sur true - msdn.microsoft.com/en-us/library/…
Andez
Il semble que je rencontre ce problème avec les contrôles ListView sur mon winform. Je me demande si c'est le ListView où vous avez vu le problème aussi?
raddevus
1

Vous définissez KeyPreview sur true dans vos options de formulaire, puis vous y ajoutez l'événement Keypress. Dans votre événement de pression de touche, vous tapez ce qui suit:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 27)
    {
        Close();
    }
}

key.Char == 27 est la valeur d'échappement en code ASCII.

Kristian
la source
C'est une bonne solution de contournement au problème. J'ai un formulaire avec des contrôles ListView dessus et dans ce cas, ils semblent avaler le CancelButton (lorsque vous appuyez sur Echap). J'ai ajouté ce code et cela a résolu le problème.
raddevus
0

Par bouton Échap, voulez-vous dire la touche Échap? A en juger par votre code, je pense que c'est ce que vous voulez. Vous pouvez également essayer Application.Exit (), mais Close devrait fonctionner. Avez-vous un thread de travail? Si un thread non en arrière-plan est en cours d'exécution, cela peut garder l'application ouverte.

SwDevMan81
la source
0

Vous devez l'ajouter à l'événement "KeyUp".

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Escape)
        {
            this.Close();
        }
    }
Dawid Bobyla
la source
0

Vous pouvez également déclencher une autre forme.

Par exemple, déclenchez un bouton Annuler si vous modifiez la propriété Form CancelButton et définissez le bouton Annuler.

Dans le code, vous traitez le bouton Annuler comme suit pour fermer le formulaire:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
webMac
la source