web-dev-qa-db-fra.com

Bouton d'échappement pour fermer le 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é ceci:

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

Et toujours rien ne fonctionne.

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

83
yeahumok

Cela fonctionnera toujours, quelles que soient l'affectation 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);
    }
184
Hans Passant

Vous devriez simplement pouvoir définir la propriété CancelButton du formulaire sur votre bouton Annuler. Vous n'aurez alors besoin d'aucun code.

56
Shawn Steward

En supposant que vous ayez un bouton "Annuler", la définition de la propriété CancelButton du formulaire (dans le concepteur ou dans le code) devrait résoudre ce problème automatiquement. Il suffit de placer le code à fermer dans l'événement Click du bouton.

15
Adam Robinson

La réponse acceptée est en effet correcte et j’ai utilisé cette approche à plusieurs reprises. Tout à coup, cela ne fonctionnerait plus, alors j'ai trouvé cela étrange. Principalement parce que mon point d'arrêt ne serait pas touché pour ESC clé, mais cela irait 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 méthode ProcessCmdKey, avec le code suivant:

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 ma forme d'obtenir le ESC key (notez le return true). Assurez-vous donc qu'aucun contrôle enfant ne prend en charge votre entrée.

7
Joel

Vous définissez KeyPreview sur true dans vos options de formulaire, puis vous y ajoutez l'événement Keypress. Dans votre événement de frappe, 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.

1
Kristian

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 Close devrait fonctionner. Avez-vous un fil de travail? Si un thread autre que d'arrière-plan est en cours d'exécution, l'application pourrait rester ouverte.

0
SwDevMan81

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 utilisez le bouton Annuler comme suit pour fermer le formulaire: 

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

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

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