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