Form.KeyPreview
- это анахронизм, унаследованный от объектной модели Visual Basic для проектирования форм. Еще в дни VB6 вам нужно было KeyPreview
, чтобы иметь возможность осуществлять сочетания клавиш. Это больше не требуется в Windows Forms, лучше переопределить ProcessCmdKey()
:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Control | Keys.F)) {
DoSomething(); // Implement the Ctrl+F short-cut keystroke
return true; // This keystroke was handled, don't pass to the control with the focus
}
return base.ProcessCmdKey(ref msg, keyData);
}
Но KeyPreview
был поддержан, чтобы помочь легиону программистов VB6 перейти на .NET еще в начале 2000-х. Смысл KeyPreview
или ProcessCmdKey()
заключается в том, чтобы позволить вашему пользовательскому интерфейсу реагировать на нажатия клавиш. Сообщения с клавиатуры обычно отправляются на элемент управления, который имеет фокус. Цикл сообщений Windows Forms позволяет коду взглянуть на это сообщение до того, как его увидит элемент управления. Это важно для сочетаний клавиш, реализация события KeyDown
для каждого элемента управления , который может привлечь внимание к их обнаружению, очень непрактична.
Установка KeyPreview
в True не вызывает проблем. Событие формы KeyDown
будет запущено, оно будет иметь влияние, только если у него есть код, который что-то делает с нажатием клавиши. Но имейте в виду, что он внимательно следит за использованием VB6, вы не можете увидеть, какие нажатия клавиш используются для навигации. Как и клавиши курсора и Tab
, Escape
и Enter
для диалога. Не проблема с ProcessCmdKey()
.