Принцип работы ввод с клавиатуры
Ввод с клавиатуры обрабатывается в 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 связанных с клавиатурой события. Общий порядок событий показывает следующая последовательность:
Пользователь помещает клавиша «», предварительно обрабатывается, подготавливается к отправке и KeyDown событием.
Пользователь удерживает клавиша «», предварительно обрабатывается, подготавливается к отправке и KeyPress событием.
Пока пользователь удерживает нажатой данную клавишу, это событие возникает несколько раз.
Пользователь отпускает клавиша «», ключ она предварительно обрабатывается, отправляется и 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. |