Кнопка 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 в параметрах формы, а затем добавляете событие Keypress в него. В событии нажатия клавиши введите следующее:
private void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 27) { Close(); } }
key.Char == 27является значением escape в коде ASCII.
Вы также можете вызвать какую-то другую форму.
Например, вызовите кнопку Cancel-Button, если вы измените свойство формы CancelButton и установите кнопку Cancel.
В коде вы обрабатываете кнопку отмены следующим образом, чтобы закрыть форму:
private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Abort; }
Comments