Как закрыть форму при нажатии клавиши escape?


У меня есть небольшая форма, которая появляется, когда я нажимаю на кнопку в Windows Forms приложение.

Я хочу иметь возможность закрыть форму, нажав клавишу escape. Как я мог это сделать? Я не уверен, что событие использовать (form_closing?)?

4 55

4 ответа:

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

установить CancelButton свойство формы для этой кнопки.

возвращает или задает элемент управления button, который нажимается при нажатии пользователем Esc ключ.

если у вас нет кнопки отмены, то вам нужно будет добавить KeyDown обработчик и проверки на клавишу ESC в что:

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

Вам также придется установить KeyPreview свойство true.

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

однако, как указывает Гарго в своем ответ это будет означать, что нажатие Esc чтобы прервать редактирование элемента управления в диалоговом окне также будет иметь эффект закрытия диалог. Чтобы избежать этого переопределить ProcessDialogKey метод следующим образом:

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

лучший способ, который я нашел, это переопределить функцию "ProcessDialogKey". Таким образом, отмена открытого элемента управления все еще возможна, потому что функция вызывается только тогда, когда ни один другой элемент управления не использует нажатую клавишу.

это то же самое поведение, что и при установке кнопки отмены. Использование события KeyDown срабатывает всегда, и поэтому форма будет закрыта, даже если она должна отменить редактирование открытого редактора.

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

Если у вас есть кнопка Отменить на вашей форме, вы можете указать форме.Свойство CancelButton для этой кнопки, а затем нажатие escape будет эффективно "нажмите кнопку".

Если у вас нет такой кнопки, Проверить форма.KeyPreview собственность.

Button cancelBTN = new Button();
cancelBTN.Size = new Size(0, 0);
cancelBTN.TabStop = false;
this.Controls.Add(cancelBTN);
this.CancelButton = cancelBTN;