Как сделать форму закрытой при нажатии клавиши выхода? - PullRequest
61 голосов
/ 20 августа 2010

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

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

Ответы [ 4 ]

109 голосов
/ 20 августа 2010

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

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

Получает или задает элемент управления кнопки, который нажимается, когда пользователь нажимает клавишу 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);
}
25 голосов
/ 13 января 2015

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

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

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}
6 голосов
/ 20 августа 2010

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

Если у вас нет такой кнопки, проверьте свойство Form.KeyPreview .

1 голос
/ 25 октября 2013
Button cancelBTN = new Button();
cancelBTN.Size = new Size(0, 0);
cancelBTN.TabStop = false;
this.Controls.Add(cancelBTN);
this.CancelButton = cancelBTN;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...