Принцип работы ввод с клавиатуры

Ввод с клавиатуры обрабатывается в Windows Forms посредством вызова событий клавиатуры в ответ на сообщения Windows. В большинстве приложений Windows Forms для обработки ввода с клавиатуры используются только события клавиатуры. Тем не менее, чтобы реализовать более сложные сценарии ввода с клавиатуры, например перехват клавиш до того, как они достигнут элемента управления, необходимо понимать, как работают сообщения клавиатуры. В этом разделе описываются типы данных ключа, распознаваемых приложением Windows Forms, и приводятся общие сведения о маршрутизацией сообщений клавиатуры. Сведения о событиях клавиатуры см. в разделе Использование событий клавиатуры.

Типы ключей

Windows Forms идентифицирует ввод с клавиатуры как коды виртуальных клавиш, представляемые побитовым перечислением Keys. Перечисление Keys позволяет объединять несколько нажатых клавиш в виде одиночного значения. Эти значения соответствуют значениям, сопровождающим сообщения Windows WM_KEYDOWN и WM_SYSKEYDOWN. Большинство физических нажатий клавиш можно обнаружить, обрабатывая события KeyDown или KeyUp. Клавиши символов представляют собой подмножество Keys перечисления и соответствуют значениям, которые сопровождают WM_CHAR и WM_SYSCHAR сообщениях Windows. Если сочетание нажатых клавиш образует знак, его можно обнаружить путем обработки события KeyPress. Кроме того, чтобы определить нажатые клавиши и отправить их, можно использовать класс Keyboard, предоставляемый интерфейсом программирования Visual Basic. Дополнительные сведения см. в разделе Доступ к клавиатуре.

Порядок событий клавиатуры

Как было показано ранее, в элементе управления могут возникать 3 связанных с клавиатурой события. Общий порядок событий показывает следующая последовательность:

  1. Пользователь нажимает клавишу "a". Она предварительно обрабатывается, подготавливается к отправке, и происходит событие KeyDown.

  2. Пользователь удерживает нажатой клавишу "a". Она предварительно обрабатывается, подготавливается к отправке, и происходит событие KeyPress.

    Пока пользователь удерживает нажатой данную клавишу, это событие возникает несколько раз.

  3. Пользователь отпускает клавишу "a". Она предварительно обрабатывается, подготавливается к отправке, и происходит событие KeyUp.

Предварительная обработка сообщений клавиатуры

Как и другие сообщения, обработка сообщений клавиатуры выполняется в методе WndProc формы или элемента управления. Тем не менее перед обработкой сообщений клавиатуры метод PreProcessMessage вызывает один или несколько методов, которые могут быть переопределены для обработки специальных знаков и физических клавиш. Эти методы можно переопределить для обнаружения и фильтрации определенных клавиш перед обработкой сообщения элементом управления. В следующей таблице показаны выполняемые действия и связанные методы в порядке их осуществления.

Предварительная обработка события KeyDown

Действие Связанный метод Примечания.
Проверка клавиши для команд, например ярлыка для сочетаний клавиш или меню. ProcessCmdKey Этот метод обрабатывает клавишу для команд, которая имеет приоритет над обычными клавишами. Если этот метод возвращает true, сообщение о нажатии клавиши не отправляется, и событие клавиши не возникает. Если он возвращает false, вызывается IsInputKey.
Проверка специальной клавиши, для которой требуется предварительная обработка, или обычной клавиши знака, которая должна вызывать событие KeyDown и отправляться в элемент управления. IsInputKey Если метод возвращает true, это означает, что элементом управления является обычный символ, и возникает событие KeyDown. Если значение равно false, вызывается ProcessDialogKey. Примечание. Чтобы элемент управления мог получить события нажатия клавиши или сочетания клавиш, можно выполнить обработку события PreviewKeyDown и установить для поля IsInputKey объекта PreviewKeyDownEventArgs значение true для необходимых клавиш.
Проверка клавиши навигации (ESC, TAB, ВВОД или клавиши со стрелками). ProcessDialogKey Этот метод обрабатывает физическую клавишу со специальными функциональными возможностями в элементе управления, например переключение фокуса между элементом управления и его родительским объектом. Если непосредственный элемент управления не обрабатывает клавишу, ProcessDialogKey вызывается в родительском элементе управления и так далее, пока не будет достигнут самый верхний элемент управления в иерархии. Если этот метод возвращает true, предварительная обработка завершается, и событие клавиатуры не возникает. Если он возвращает false, возникает событие KeyDown.

Предварительная обработка события KeyPress

Действие Связанный метод Примечания.
Убедитесь, что клавиша является обычным символом, который должен быть обработан элементом управления IsInputChar Если это обычный символ, данный метод возвращает true, возникает событие KeyPress, и последующая предварительная обработка не выполняется. В противном случае будет вызван ProcessDialogChar.
Проверьте, не является ли символ назначенной клавишей (например, &OK на кнопке) ProcessDialogChar Этот метод, аналогичный ProcessDialogKey, вызывается в иерархии элементов управления. Если элемент управления является контейнерным, он проверяет наличие назначенных клавиш путем вызова ProcessMnemonic в себя самого и свои дочерние элементы управления. Если ProcessDialogChar возвращает true, событие KeyPress не происходит.

Обработка сообщений клавиатуры

После того как сообщения клавиатуры достигают метода WndProc формы или элемента управления, они обрабатываются набором методов, которые могут быть переопределены. Каждый из этих методов возвращает значение Boolean, указывающее, было ли сообщение клавиатуры обработано и использовано элементом управления. Если один из методов возвращает true, сообщение считается обработанным и не передается в базовый или родительский объект элемента управления для дальнейшей обработки. В противном случае сообщение остается в очереди сообщений и может быть обработано в другом методе в базовом или родительском объекте элемента управления. В следующей таблице представлены методы, обеспечивающие обработку сообщений клавиатуры.

Способ Примечания.
ProcessKeyMessage Этот метод обрабатывает все сообщения клавиатуры, полученные методом WndProc элемента управления.
ProcessKeyPreview Этот метод отправляет сообщение клавиатуры в родительский объект элемента управления. Если ProcessKeyPreview возвращает true, событие нажатия клавиши не создается, в противном случае вызывается ProcessKeyEventArgs.
ProcessKeyEventArgs При необходимости этот метод вызывает события KeyDown, KeyPress или KeyUp.

Переопределение методов клавиатуры

Существует множество методов переопределения, когда выполняется предварительная и основная обработка сообщений клавиатуры. Тем не менее некоторые методы отличаются большим удобством. В таблице ниже приведены задачи, которые может быть необходимо выполнить, и оптимальные способы переопределения методов для сообщений клавиатуры. Дополнительные сведения о переопределении методов см. в разделе Переопределение свойств и методов в производных классах.

Задача Способ
Перехватить клавишу навигации и создать событие KeyDown. Например, в текстовом поле необходимо обработать клавиши TAB и Return. Переопределите IsInputKey. Примечание. Можно также обработать событие PreviewKeyDown и установить для IsInputKey объекта PreviewKeyDownEventArgs значение true для необходимой клавиши или клавиш.
Выполнение специальной обработки ввода или навигации в элементе управления. Например, необходимо использовать клавиши со стрелками в элементе управления "Список", чтобы изменить выбранный элемент. Переопределите метод ProcessDialogKey.
Перехватить клавишу навигации и создать событие KeyPress. Например, в элементе управления регулятора требуется выполнение нескольких нажатий клавиши со стрелкой для ускорения перехода между элементами. Переопределите IsInputChar.
Выполнить специальный ввод или обработку навигации во время события KeyPress. Например, в элементе управления "Список" при удержании нажатой клавиши "r" следует переходить между элементами, которые начинаются с буквы "r". Переопределите метод ProcessDialogChar.
Выполнение обработки пользовательских назначенных клавиш. Например, необходимо обрабатывать назначенные клавиши на кнопках, нарисованных владельцем, содержащихся на панели инструментов. Переопределите ProcessMnemonic.

См. также