Escape-Schaltfläche zum Schließen des Windows Forms-Formulars in C #

90

Ich habe folgendes versucht:

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

Aber es funktioniert nicht.

Dann habe ich das versucht:

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

Und immer noch funktioniert nichts.

Die KeyPreview in meinen Windows Forms-Formulareigenschaften ist auf true gesetzt ... Was mache ich falsch?

yeahumok
quelle
1
Haben Sie versucht, in diesen Methoden einen Haltepunkt festzulegen? Feuert der Event-Handler überhaupt?
Steve Danner
1
Benennen Sie Ihre Abbrechen-Schaltfläche nicht wie die Formulareigenschaft 'CancelButton'. Andernfalls können Sie den CancelButton anscheinend nicht festlegen.
Jonas Middendorf
@SteveDanner, Ereignis wird nicht ausgelöst. Wahrscheinlich fehlt die Deklaration in InitializeComponent ().
InfantPro'Aravind '12.
Ich denke, dass der Grund, warum es nicht funktioniert, darin besteht, dass andere Steuerelemente innerhalb des Formulars den Fokus erhalten haben ...
itsho

Antworten:

199

Dies funktioniert immer, unabhängig von der richtigen Zuweisung des Ereignishandlers, KeyPreview, CancelButton usw.:

    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
quelle
10
-1 ist die Verwendung der CancelButton-Eigenschaft von Form der richtige Weg.
ABCD
14
Ugh, die 1980er Jahre nannten, sie wollen ihr Dialogfeld zurück.
Hans Passant
1
Sie können auch das Rück truevon ProcessCmdKeyzu signalisieren , dass der Schlüssel gehandhabt wird, damit das „ding“ Rauschen verhindert wird .
Spooky
8
Sie können eine CancelButton-Eigenschaft des Formulars nur verwenden, wenn das Formular eine tatsächliche Schaltfläche enthält (oder ein IButtonControl-Schnittstellenobjekt).
David
3
Diese Option ist gut. CancelButton erfordert eine zusätzliche sichtbare Schaltfläche "Abbrechen" im Formular. Dies ist redundantes Rendern + Code + etc
V319
63

Sie sollten nur in der Lage sein, die CancelButtonEigenschaft des Formulars auf die Schaltfläche Abbrechen festzulegen, und benötigen dann keinen Code.

Shawn Steward
quelle
2
Ich habe das getan, aber es wird nicht ausgelöst, wenn ich esc drücke. Warum?
Mihai Bratulescu
Das hat bei mir super funktioniert. Viel besser für kleine Formen.
Knut
15

Angenommen, Sie haben eine Schaltfläche "Abbrechen", sollte das Festlegen der CancelButtonEigenschaft des Formulars (entweder im Designer oder im Code) dies automatisch erledigen. Platzieren Sie einfach den Code, der im ClickFalle der Schaltfläche geschlossen werden soll.

Adam Robinson
quelle
9

Die akzeptierte Antwort ist in der Tat richtig, und ich habe diesen Ansatz mehrmals verwendet. Plötzlich würde es nicht mehr funktionieren, also fand ich es seltsam. Meistens, weil mein Haltepunkt nicht für die ESCTaste getroffen würde, sondern für andere Tasten.

Nach dem Debuggen stellte ich fest, dass eines der Steuerelemente in meinem Formular die ProcessCmdKeyMethode mit diesem Code überschrieb :

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

... und dies verhinderte, dass mein Formular den ESCSchlüssel erhielt (beachten Sie das return true). Stellen Sie also sicher, dass keine untergeordneten Steuerelemente Ihre Eingabe übernehmen.

Joel
quelle
Ich bin mir nicht sicher, ob Sie das Formular KeyPreview auf true setzen müssen - msdn.microsoft.com/en-us/library/…
Andez
Ich habe dieses Problem anscheinend mit ListView-Steuerelementen auf meiner Winform. Ich frage mich, ob es die ListView ist, in der Sie das Problem auch gesehen haben.
Raddevus
1

Sie setzen KeyPreview in Ihren Formularoptionen auf true und fügen dann das Keypress-Ereignis hinzu. In Ihrem Tastendruckereignis geben Sie Folgendes ein:

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

key.Char == 27 ist der Wert von Escape im ASCII-Code.

Kristian
quelle
Dies ist eine gute Problemumgehung. Ich habe ein Formular mit ListView-Steuerelementen und in diesem Fall scheinen sie den CancelButton zu verschlucken (wenn Esc gedrückt wird). Ich habe diesen Code hinzugefügt und das Problem behoben.
Raddevus
0

Mit der Schaltfläche "Escape" meinen Sie die Escape-Taste? Nach Ihrem Code zu urteilen, denke ich, dass Sie das wollen. Sie können auch Application.Exit () ausprobieren, aber Close sollte funktionieren. Hast du einen Arbeitsthread? Wenn ein Thread ohne Hintergrund ausgeführt wird, kann die Anwendung dadurch geöffnet bleiben.

SwDevMan81
quelle
0

Sie müssen dies zum Ereignis "KeyUp" hinzufügen.

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

Sie können auch ein anderes Formular auslösen.

Lösen Sie beispielsweise eine Abbrechen-Schaltfläche aus, wenn Sie die Eigenschaft Form CancelButton bearbeiten und die Schaltfläche Abbrechen festlegen.

Im Code behandeln Sie die Schaltfläche Abbrechen wie folgt, um das Formular zu schließen:

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