Я пробовал следующее:
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 ... Что я делаю не так?
Ответы:
Это всегда будет работать, независимо от правильного назначения обработчика событий
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); }
источник
true
из,ProcessCmdKey
чтобы подать сигнал о том, что клавиша обработана, тем самым предотвращая шум "дина".Вы должны просто установить
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
). Поэтому убедитесь, что никакие дочерние элементы управления не перехватывают ваш ввод.источник
Вы устанавливаете для KeyPreview значение true в параметрах формы, а затем добавляете к нему событие Keypress. В событии нажатия клавиш вы вводите следующее:
private void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 27) { Close(); } }
key.Char == 27
- значение escape в коде ASCII.источник
Под кнопкой Escape вы подразумеваете клавишу Escape? Судя по вашему коду, я думаю, что вы этого хотите. Вы также можете попробовать Application.Exit (), но Close должен работать. У вас есть рабочий поток? Если запущен нефоновый поток, это может оставить приложение открытым.
источник
Вам нужно добавить это в событие «KeyUp».
private void Form1_KeyUp(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Escape) { this.Close(); } }
источник
Вы также можете активировать другую форму.
Например, активируйте кнопку отмены, если вы отредактируете свойство Form CancelButton и установите кнопку Cancel.
В коде вы обрабатываете кнопку отмены следующим образом, чтобы закрыть форму:
private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Abort; }
источник