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


93

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

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
Вы пробовали установить точку останова в этих методах? Срабатывает ли обработчик событий?
Стив Даннер,

1
Не называйте кнопку отмены так, как свойство формы «CancelButton». В противном случае кажется, что вы не можете установить CancelButton.
Йонас Миддендорф

@SteveDanner, событие не запускается. вероятно, объявление в InitializeComponent () отсутствует.
InfantPro'Aravind '12

Я думаю, что причина, по которой это не работает, заключается в том, что другие элементы управления внутри формы получили фокус ...
itsho

Ответы:


199

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

10
-1, использование свойства CancelButton формы является правильным.
ABCD

14
Ух, звонили 80-е, они хотят вернуть свое диалоговое окно.
Ханс Пассан

1
Вы также можете вернуться trueиз, ProcessCmdKeyчтобы подать сигнал о том, что клавиша обработана, тем самым предотвращая шум "дина".
Spooky

8
Вы можете использовать свойство CancelButton формы только в том случае, если на форме есть настоящая кнопка (или интерфейсный объект IButtonControl).
Дэвид

3
Этот вариант хорош. Для CancelButton требуется дополнительная видимая кнопка «Отмена» в форме. Это избыточный рендер + код + и т. Д.
V319,

64

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


2
Я сделал это, но он не запускается, когда я нажимаю esc, почему?
Михай Братулеску

Это отлично сработало для меня. Намного лучше для малых форм.
knut 08

15

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


9

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


Сверху в голове, не уверен, нужно ли вам установить для формы KeyPreview значение true - msdn.microsoft.com/en-us/library/…
Andez

Кажется, я столкнулся с этой проблемой с элементами управления ListView в моей winform. Интересно, не в ListView ли вы тоже заметили проблему?
raddevus

2

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

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

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


Это хороший способ решения проблемы. У меня есть форма с элементами управления ListView, и в этом случае они, кажется, проглатывают CancelButton (при нажатии Esc). Я добавил этот код, и проблема была устранена.
raddevus

0

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


0

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

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

0

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

Например, активируйте кнопку отмены, если вы отредактируете свойство Form CancelButton и установите кнопку Cancel.

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

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.