Принцип работы ввод с клавиатуры
Обновлен: Ноябрь 2007
Ввод данных с клавиатуры обрабатывается в Windows Forms посредством вызова события клавиатуры в ответ на сообщения Windows. Большинство приложений Windows Forms обрабатывают ввод данных с клавиатуры только с помощью обработки событий клавиатуры. Тем не менее, необходимо понимать, как работают сообщения клавиатуры, чтобы иметь возможность реализовать дополнительные сценарии ввода с клавиатуры, например перехват клавиш до поступления соответствующего события в элемент управления. В этом разделе описываются типы данных о клавишах, которые распознает Windows Forms, и приводится обзор способов перенаправления сообщений клавиатуры. Сведения о событиях клавиатуры см. в разделе Использование событий клавиатуры.
Типы клавиш
Windows Forms идентифицирует ввод данных с клавиатуры как коды виртуальных клавиш, представленные битовым перечислением Keys. С помощью перечисления Keys можно объединить ряд нажатых клавиш в одиночное значение. Эти значения соответствуют значениям, сопровождающим сообщения Windows WM_KEYDOWN и WM_SYSKEYDOWN. Нажатие большинства физических клавиш можно обнаружить, обрабатывая событие KeyDown или KeyUp. Клавиши знаков являются подмножеством перечисления Keys и соответствуют значениям, сопровождающим сообщения Windows WM_CHAR и WM_SYSCHAR. Если сочетание нажатых клавиш образует знак, его можно обнаружить, обрабатывая событие KeyPress. Кроме того, для обнаружения того, какие клавиши были нажаты и отправлены, можно использовать метод Keyboard, предоставляемый интерфейсом программирования Visual Basic. Дополнительные сведения см. в разделе Доступ к клавиатуре.
Порядок событий клавиатуры
Как перечислено выше, существует 3 связанных с клавиатурой события, которые могут возникать в элементе управления. Следующая последовательность показывает общий порядок возникновения событий.
Пользователь нажимает клавишу "a", соответствующее сообщение предварительно обрабатывается, отправляется, и происходит событие KeyDown.
Пользователь удерживает клавишу "a", соответствующее сообщение предварительно обрабатывается, отправляется, и происходит событие KeyPress.
Это событие возникает несколько раз, пока пользователь удерживает клавишу.
Пользователь отпускает клавишу "a", соответствующее сообщение предварительно обрабатывается, отправляется, и происходит событие KeyUp.
Предварительная обработка сообщений клавиатуры
Как и другие сообщения, сообщения клавиатуры обрабатываются в методе WndProc формы или элемента управления. Однако перед обработкой сообщений клавиатуры метод PreProcessMessage вызывает один или несколько методов, которые могут быть переопределены для обработки сообщений клавиш специальных знаков и физических клавиш. Эти методы можно переопределить для обнаружения и фильтрации определенных клавиш перед обработкой сообщения элементом управления. В следующей таблице показаны выполняемые действия и связанный с ними метод в том порядке, в котором метод вызывается.
Предварительная обработка события KeyDown
Действие |
Связанный метод |
Примечания |
---|---|---|
Проверка управляющих клавиш, например горячих клавиши или сочетаний клавиш меню. |
Этот метод обрабатывает управляющие клавиши, которые имеют приоритет над обычными клавишами. Если этот метод возвращает значение true, сообщение о нажатии клавиши не отправляется и событие клавиатуры не возникает. Если он возвращает значение false, вызывается метод IsInputKey. |
|
Проверяет, является ли данная клавиша специальным знаком, требующим предварительной обработки, или это обычная клавиша, которая должна вызвать событиеKeyDown и быть отправлена в элемент управления. |
Если этот метод возвращает значение true, значит, это обычный знак и возникает событие KeyDown. Если возвращается значение false, вызывается метод ProcessDialogKey.
Примечание.
Чтобы убедиться в получении элементом управления клавиши или сочетания клавиш, можно обработать событие PreviewKeyDown и задать для метода IsInputKey класса PreviewKeyDownEventArgs значение true для требуемой клавиши или сочетания клавиш.
|
|
Проверяет, является ли клавиша клавишей перехода (ESC, TAB, ВВОД и клавиши со стрелками) |
Этот метод обрабатывает физические клавиши, которые имеют специальное действие в элементе управления, такие как переключение фокуса между элементом управления и его родителем. Если непосредственный элемент управления не обрабатывает клавишу, вызывается метод ProcessDialogKey родительского элемента управления, и эта процедура продолжается до самого верхнего элемента управления в иерархии. Если этот метод возвращает значение true, предварительная обработка завершается, а событие клавиатуры не возникает. Если возвращается значение false, возникает событие KeyDown. |
Предварительная обработка события KeyPress
Действие |
Связанный метод |
Примечания |
---|---|---|
Проверяет, является ли клавиша обычным знаком, который должен обрабатываться элементом управления |
Если клавиша является обычным знаком, этот метод возвращает значение true, вызывается событие KeyPress и дальнейшая предварительная обработка не происходит. В противном случае будет вызван метод ProcessDialogChar. |
|
Проверяет, является ли знак сокращением (как &OK на кнопке) |
Этот метод аналогичен методу ProcessDialogKey, он будет вызван на более высоком уровне иерархии элементов управления. Если элемент управления является контейнерным, он проверяет наличие сокращения, вызывая метод ProcessMnemonic у самого себя и своих дочерних элементов. Если метод ProcessDialogChar возвращает значение true, событие KeyPress не возникает. |
Обработка сообщений клавиатуры
После того как сообщения клавиатуры достигают метода WndProc формы или элемента управления, они обрабатываются группой переопределяемых методов. Каждый из этих методов возвращает значение Boolean, указывающее, было ли сообщение клавиатуры обработано и получено элементом управления. Если один из методов возвращает значение true, то сообщение считается обработанным и не передается базовому или родительскому элементу управления для дальнейшей обработки. В противном случае сообщение остается в очереди сообщений и может быть обработано в другом методе базового или родительского элемента управления. В следующей таблице представлены методы, которые обрабатывают сообщения клавиатуры.
Метод |
Примечания |
---|---|
Этот метод обрабатывает все сообщения клавиатуры, полученные методом WndProc элемента управления. |
|
Этот метод передает сообщение клавиатуры родительскому элементу управления. Если метод ProcessKeyPreview возвращает значение true, событие клавиатуры не создается, в противном случае вызывается метод ProcessKeyEventArgs. |
|
Этот метод вызывает соответствующие события KeyDown, KeyPress и KeyUp. |
Переопределение методов клавиатуры
При предварительной обработке и обработке сообщений клавиатуры существует много доступных для переопределения методов; однако некоторые методы являются гораздо более удобными, чем другие. В следующей таблице перечислены задачи, которые, возможно, потребуется выполнить, и оптимальные способы переопределения методов сообщений клавиатуры. Дополнительные сведения о переопределении методов см. в разделе Переопределение свойств и методов.
Задача |
Метод |
---|---|
Перехват клавиши перехода и вызов события KeyDown. Например, требуется обработка сообщения клавиши TAB или ВВОД в текстовом поле |
Переопределите метод IsInputKey. |
Выполнение специального ввода или обработка переходов в элементе управления. Например, требуется использование клавиш со стрелками в элементе управления списка для изменения выбранного элемента. |
Переопределите метод ProcessDialogKey. |
Перехват клавиши перехода и вызов события KeyPress. Например, в элементе управления "Регулятор" может потребоваться несколько нажатий клавиши со стрелкой для ускорения прокрутки между элементами. |
Переопределите метод IsInputChar. |
Выполнение специального ввода или обработка переходов во время события KeyPress. Например, в элементе управления списка удержание клавиши "к" пропускает элементы, начинающиеся с буквы "к". |
Переопределите метод ProcessDialogChar. |
Произведите обработку пользовательских сокращений; например, таким образом, чтобы обрабатывать сокращения рисуемых владельцем кнопок, содержащихся в панели инструментов. |
Переопределите метод ProcessMnemonic. |
См. также
Основные понятия
Использование событий клавиатуры