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


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

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... Что я делаю не так?

8 81

8 ответов:

это всегда будет работать, независимо от правильного назначения обработчика событий, 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);
    }

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

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

принятый ответ действительно правильный, и я использовал этот подход в несколько раз. Внезапно, это больше не будет работать, так что я нашел это странным. В основном потому, что моя точка останова не будет поражена для 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). Поэтому убедитесь, что никакие дочерние элементы управления не принимают ваш ввод.

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

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

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

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

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

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

вы также можете вызвать некоторые другие формы.

например, вызвать кнопку отмены, если вы измените свойство формы CancelButton и установите кнопку Отмена.

в коде вы обрабатываете кнопку отмены следующим образом, чтобы закрыть форму:

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