Кнопка Escape для закрытия формы Windows Forms в С#

Я пробовал следующее:

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

Но это не сработает.

Затем я попробовал это:

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

И все еще ничего не работает.

В KeyPreview для моих свойств формы Windows Forms установлено значение true... Что я делаю неправильно?

Ответ 1

Это всегда будет работать независимо от правильного назначения обработчика события, KeyPreview, CancelButton и т.д.:

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

Ответ 2

Вы должны просто установить свойство Form CancelButton на кнопку "Отмена", а затем вам не понадобится код.

Ответ 3

Предполагая, что у вас есть кнопка "Отмена", настройка свойства формы CancelButton (либо в дизайнере, либо в коде) должна быть выполнена автоматически. Просто поместите код для закрытия в событии Click кнопки.

Ответ 4

Принятый ответ действительно правильный, и я использовал этот подход несколько раз. Внезапно это больше не сработало, поэтому мне показалось странным. Главным образом, потому что моя точка останова не попала бы в клавишу ESC, но она ударила бы по другим клавишам.

После отладки я узнал, что один из элементов управления из моей формы переопределяет метод ProcessCmdKey, с помощью этого кода:

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

... и это мешало моей форме получить ключ ESC (обратите внимание на return true). Поэтому убедитесь, что никакие дочерние элементы управления не захватили ваш вход.

Ответ 5

Кнопкой Escape вы имеете в виду клавишу Escape? Судя по твоему коду, я думаю, что ты хочешь. Вы также можете попробовать Application.Exit(), но Close должен работать. У вас есть рабочий поток? Если выполняется нефонический поток, это может открыть приложение.

Ответ 6

Вам нужно добавить это к событию "KeyUp".

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

Ответ 7

Вы устанавливаете KeyPreview в true в своих вариантах формы, а затем добавляете к нему событие Keypress. В вашем событии нажатия клавиши введите следующее:

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

key.Char == 27 - это значение escape в коде ASCII.