Остановите ключ ввода от запуска WinForm - PullRequest
5 голосов
/ 07 февраля 2012

У меня есть основное настраиваемое диалоговое окно для использования с различными элементами управления в приложении WinForms.Диалог выглядит так:

The custom dialog

По разным причинам я не хочу, чтобы пользователь имел возможность использовать клавишу Enter для выбора опции «Да» (buttonYes).Ранее я хотел этого поведения и соответственно установил свойство AcceptButton кнопки Да (buttonYes).Я удалил это scince, установив для свойства buttonYes s AcceptButton значение «Нет», но форма по-прежнему вызывает событие buttonYes.Click при нажатии клавиши Enter.Я также пытался обработать события KeyPress или KeyDown, но они не запускаются при использовании клавиши Enter.Это просто и раздражает, кто-нибудь сталкивался с этим и что я могу сделать, чтобы реализовать желаемую функциональность?

Ответы [ 5 ]

8 голосов
/ 07 февраля 2012

Чтобы исправить это, установите для свойства TabStop значение False и используйте код ниже:

private void form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
        e.Handled = true;
}

Или, если, как вы говорите, вы не можете сломать KeyPressEvent, вам нужнообрабатывать ProcessKeyPreview

protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m)
{
    int _ENTER = 13;

    if (m.Msg == _ENTER)
    {
        //Do nothing
    }
    return base.ProcessKeyPreview(ref m);
}
6 голосов
/ 22 марта 2016

Все ответы здесь неверны или имеют неправильный акцент.

enter image description here

Чтобы понять, что происходит, вы должны понять, как в основном реализован Form.ShowDialog (...). Под капотом ShowDialog входит в свой собственный цикл сообщений. Этот цикл сообщений имеет жестко запрограммированную логику, которая специально обрабатывает клавишу Enter.

Диалог не закрывается, потому что кнопка ОК имеет фокус, происходит нажатие ввода, и WinForms выполняет логику нажатия кнопки ОК, которая закрывает окно. Диалоговое окно закрывается, потому что сообщение Enter для ввода извлекается из цикла сообщений, который выполняется в верхней части стека вызовов, используется и заставляет ShowDialog прерывать цикл и закрывать окно ... так что вы можете ' получить нужную вам функциональность, обрабатывая события нажатия клавиш на кнопке; Событие нажатия клавиши для Enter никогда не отправляется. События, проходящие через KeyPreview, - это просто еще один способ получить доступ к тем же событиям, и поэтому это также не помогает.

Единственное, что работает, - это установить для свойства AcceptButton формы значение (нет). Для кнопки «ОК» все еще может быть установлено свойство «DialogResult», равное «OK», поэтому это не приведет к разрыву диалогового окна, но если для параметра «AcceptButton» задано значение «none», WinForms просто игнорирует щелчки Enter из ShowDialog.

4 голосов
/ 07 февраля 2012

Кроме того, если вы хотите, чтобы пользователям приходилось нажимать на кнопки, вместо использования клавиатуры вы можете установить для свойства TabStop значение False на кнопках.

1 голос
/ 07 февраля 2012

Поскольку вы уже изменили свойство кнопки Accpet: как насчет свойства KeyPreview формы? Это установлено в false или true? Может быть, вы установили значение true где-то по пути и забыли об этом. Установите значение false.

0 голосов
/ 07 февраля 2012

Вы должны взглянуть на файл * .resx или * .ressources. Найдите свойство AcceptButton. Возможно, он установлен в одном из этих файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...