Я использовал событие KeyDown, и некоторый простой код, например if (e.KeyCode == Keys.F1)
для захвата F1, был нажат на форму, но если в форме есть некоторые текстовые поля или если на форме есть некоторые таблицы с Dock Fill, тогда код выше получает бесполезно и ничего не делает. Но я хочу что-то сделать, когда пользователь нажимает F1 на эту форму. так как мы фиксируем конкретное событие keydown, такое как F1 на всей форме. И я не хочу идти на маршрут, который захватывает KeyDown всех других элементов управления в форме и передает их в форму для обработки. есть ли более чистый способ сделать это?
Как я могу захватить Keys.F1 независимо от сфокусированного управления формой?
Ответ 1
Да, действительно есть. Правильный способ обработки формы ключевыми событиями независимо от элемента управления, который в настоящее время имеет фокус ввода, заключается в переопределении метода ProcessCmdKey
вашего класс формы:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.F1)
{
MessageBox.Show("You pressed the F1 key");
return true; // indicate that you handled this keystroke
}
// Call the base class
return base.ProcessCmdKey(ref msg, keyData);
}
Вы возвращаете true
, чтобы указать, что вы обработали нажатие клавиши и не хотите, чтобы она передавалась другим элементам управления. Если вы хотите, чтобы он был передан обработчикам событий для других элементов управления, просто верните false
.
И вам лучше игнорировать свойство KeyPreview
. Это анахронизм из VB 6 дней и не самый предпочтительный способ сделать это в мире .NET. Дальнейшее чтение: Недостаток настройки Form.KeyPreview = true?
Ответ 2
Задайте для формы KeyPreview
значение true. Это приведет к тому, что форма сначала получит сообщения о нажатиях клавиш, и если вы справитесь с этим, вы можете установить e.Handled = true
, чтобы он не передавался элементам управления.
Ответ 3
Включите KeyPreview
, и каждое нажатие клавиши в форме сначала направляется через обработчики ключевых событий.
Ответ 4
Другой способ - переопределить функцию ProcessCmdKey http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=VS.100).aspx