Кнопка Escape, чтобы закрыть форму Windows Forms в C # - PullRequest
86 голосов
/ 18 февраля 2010

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

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 ]

188 голосов
/ 18 февраля 2010

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

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

15 голосов
/ 18 февраля 2010

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

7 голосов
/ 08 августа 2014

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

1 голос
/ 26 октября 2016

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

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

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

0 голосов
/ 28 марта 2018

Вы также можете запустить другую форму.

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

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

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
0 голосов
/ 17 августа 2016

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

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Escape)
        {
            this.Close();
        }
    }
0 голосов
/ 18 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...