Кнопка 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.