Все ответы здесь неверны или имеют неправильный акцент.
![enter image description here](https://i.stack.imgur.com/dYtEv.png)
Чтобы понять, что происходит, вы должны понять, как в основном реализован Form.ShowDialog (...). Под капотом ShowDialog входит в свой собственный цикл сообщений. Этот цикл сообщений имеет жестко запрограммированную логику, которая специально обрабатывает клавишу Enter.
Диалог не закрывается, потому что кнопка ОК имеет фокус, происходит нажатие ввода, и WinForms выполняет логику нажатия кнопки ОК, которая закрывает окно. Диалоговое окно закрывается, потому что сообщение Enter для ввода извлекается из цикла сообщений, который выполняется в верхней части стека вызовов, используется и заставляет ShowDialog прерывать цикл и закрывать окно ... так что вы можете ' получить нужную вам функциональность, обрабатывая события нажатия клавиш на кнопке; Событие нажатия клавиши для Enter никогда не отправляется. События, проходящие через KeyPreview, - это просто еще один способ получить доступ к тем же событиям, и поэтому это также не помогает.
Единственное, что работает, - это установить для свойства AcceptButton формы значение (нет). Для кнопки «ОК» все еще может быть установлено свойство «DialogResult», равное «OK», поэтому это не приведет к разрыву диалогового окна, но если для параметра «AcceptButton» задано значение «none», WinForms просто игнорирует щелчки Enter из ShowDialog.