it-swarm.com.de

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

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 geht nicht.

Dann habe ich es versucht:

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

Und noch funktioniert nichts.

Die KeyPreview für meine Formulareigenschaften von Windows Forms ist auf true gesetzt. Was mache ich falsch?

83
yeahumok

Dies funktioniert immer, unabhängig von der richtigen Zuweisung von Ereignishandlern, 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);
    }
184
Hans Passant

Sie sollten in der Lage sein, die CancelButton -Eigenschaft des Formulars auf die Schaltfläche Abbrechen zu setzen, und dann benötigen Sie keinen Code.

56
Shawn Steward

Wenn Sie die Schaltfläche "Abbrechen" haben, sollten Sie dies durch die Einstellung der Eigenschaft CancelButton des Formulars (entweder im Designer oder im Code) automatisch festlegen. Fügen Sie einfach den Code zum Schließen in das Ereignis Click der Schaltfläche ein.

15
Adam Robinson

Die akzeptierte Antwort ist in der Tat richtig, und ich habe diesen Ansatz mehrere Male verwendet. Plötzlich würde es nicht mehr funktionieren, also fand ich es seltsam. Meistens, weil mein Haltepunkt nicht erreicht werden würde ESC Schlüssel, aber es würde für andere Schlüssel schlagen.

Nach dem Debuggen stellte ich fest, dass eines der Steuerelemente in meinem Formular die ProcessCmdKey -Methode mit folgendem 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 das verhinderte, dass meine Form das ... bekam ESC Schlüssel (beachten Sie den return true). Stellen Sie also sicher, dass keine untergeordneten Steuerelemente Ihre Eingabe übernehmen.

7
Joel

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

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

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

1
Kristian

Mit der Escape-Taste meinen Sie die Escape-Taste? Gemessen an Ihrem Code denke ich, dass Sie das wollen. Sie können Application.Exit () auch versuchen, aber Schließen sollte funktionieren. Hast du einen Arbeiter-Thread? Wenn ein Thread ohne Hintergrund ausgeführt wird, kann die Anwendung geöffnet bleiben.

0
SwDevMan81

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

Z.B. Lösen Sie einen Cancel-Button aus, wenn Sie die Form CancelButton-Eigenschaft bearbeiten und die Schaltfläche Cancel festlegen. 

Im Code behandeln Sie den Abbrechen-Button wie folgt, um das Formular zu schließen: 

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

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

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