Przycisk Escape do zamknięcia okna Forms formularz w C#

Próbowałem:

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

Potem próbowałem tego:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Escape)
        this.Close();
}
I nadal nic nie działa.

We właściwościach formularza Windows Forms jest ustawione na true... Co robię źle?

 81
Author: Peter Mortensen, 2010-02-18

8 answers

To będzie zawsze działać, niezależnie od właściwego przypisania obsługi zdarzeń, KeyPreview, CancelButton itp:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) {
            this.Close();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
 179
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 15:40:02

Powinieneś być w stanie ustawić właściwość formularza CancelButton Na przycisku Anuluj, a wtedy nie będziesz potrzebował żadnego kodu.

 53
Author: Shawn Steward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 18:08:43

Zakładając, że masz przycisk "Anuluj", ustawienie właściwości CancelButton formularza (zarówno w Projektancie, jak i w kodzie) powinno zająć się tym automatycznie. Wystarczy umieścić kod, aby zamknąć w zdarzeniu Click przycisku.

 15
Author: Adam Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 18:09:09

Przyjęta odpowiedź rzeczywiście jest poprawna, i użyłem tego podejścia kilka razy. Nagle przestało działać, więc uznałem to za dziwne. Głównie dlatego, że mój punkt przerwania nie zostałby trafiony dla ESC, ale trafiłby dla innych kluczy.

Po debugowaniu dowiedziałem się, że jedna z kontrolek z mojego formularza była nadrzędnaProcessCmdKey Metoda, o tym kodzie:

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

... a to uniemożliwiało mojemu formularzowi uzyskanie klucza ESC (zwróć uwagę na return true). Więc upewnij się że żadne kontrolki dziecięce nie przejmują Twojego wkładu.

 5
Author: Joel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-08 09:33:01

Przez klawisz Escape masz na myśli klawisz Escape? Sądząc po Twoim kodzie, myślę, że tego właśnie chcesz. Możesz również spróbować aplikacji.Exit (), ale Close powinno działać. Masz wątek roboczy? Jeśli uruchomiony jest wątek bez tła, może to utrzymać otwartą aplikację.

 0
Author: SwDevMan81,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-27 12:53:12

Musisz dodać to do zdarzenia "KeyUp".

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Escape)
        {
            this.Close();
        }
    }
 0
Author: Dawid Bobyla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 08:24:33

Ustawiasz KeyPreview na true w opcjach formularza, a następnie dodajesz do niego Zdarzenie Keypress. W zdarzeniu keypress wpisujesz:

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

key.Char == 27 jest wartością escape w kodzie ASCII.

 0
Author: Kristian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-15 18:45:35

Możesz również uruchomić inną formę.

Np. Uruchom przycisk Anuluj, jeśli edytujesz właściwość formularza anuluj i ustawisz przycisk Anuluj.

W kodzie kliknij przycisk Anuluj w następujący sposób, aby zamknąć formularz:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
 0
Author: webMac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 09:01:04