Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Windows Forms обрабатывает ввод с клавиатуры, генерируя события клавиатуры в ответ на сообщения Windows. Большинство приложений Windows Forms обрабатывают ввод клавиатуры исключительно путем обработки событий клавиатуры. Однако необходимо понять, как работают сообщения клавиатуры, чтобы реализовать более сложные сценарии ввода клавиатуры, например перехват ключей, прежде чем они достигают элемента управления. В этом разделе описываются типы ключевых данных, распознаваемых Windows Forms, и представлены общие сведения о маршрутизации сообщений клавиатуры. Сведения о событиях клавиатуры см. в разделе Использование событий клавиатуры.
Типы ключей
Windows Forms определяет ввод с клавиатуры в виде кодов виртуальных клавиш, представленных в формате битовой операции перечисления Keys. С помощью перечисления Keys можно объединить ряд нажатий клавиш, чтобы привести к одному значению. Эти значения соответствуют значениям, которые сопровождают сообщения WM_KEYDOWN и WM_SYSKEYDOWN в Windows. Вы можете обнаружить нажатия большинства физических клавиш, обрабатывая события KeyDown или KeyUp. Клавиши символов представляют собой подмножество перечисления Keys и соответствуют значениям, которые сопровождают WM_CHAR и WM_SYSCHAR в сообщениях Windows. Если сочетание нажатия клавиш приводит к символу, можно обнаружить символ, обрабатывая событие KeyPress. Кроме того, можно использовать Keyboard, который предоставляется интерфейсом программирования Visual Basic, для определения нажатых клавиш и отправки этих клавиш. Дополнительные сведения см. в разделе Доступ к клавиатуре.
Порядок событий клавиатуры
Как указано ранее, на элементе управления могут возникать 3 события, связанные с клавиатурой. В следующей последовательности показан общий порядок событий:
Пользователь нажимает клавишу "a", клавиша предварительно обрабатывается, отправляется и происходит событие KeyDown.
Пользователь удерживает клавишу "a", клавиша предварительно обрабатывается, передается и происходит событие KeyPress.
Это событие происходит несколько раз по мере того, как пользователь содержит ключ.
Пользователь освобождает ключ "a", ключ предварительно обрабатывается, отправляется и происходит событие KeyUp.
Предварительная обработка ключей
Как и другие сообщения, сообщения клавиатуры обрабатываются в методе WndProc формы или элемента управления. Однако перед обработкой сообщений клавиатуры метод PreProcessMessage вызывает один или несколько методов, которые можно переопределить для обработки специальных символьных клавиш и физических ключей. Эти методы можно переопределить для обнаружения и фильтрации определенных ключей перед обработкой сообщений элементом управления. В следующей таблице показаны действия, выполняемые и связанные методы, в том порядке, в который выполняется метод.
Предварительная обработка события KeyDown
Действие | Связанный метод | Примечания |
---|---|---|
Проверьте наличие клавиши команды, например акселератора или контекстного меню. | ProcessCmdKey | Этот метод обрабатывает ключ команды, который имеет приоритет над обычными ключами. Если этот метод возвращает true , ключевое сообщение не отправляется и ключевое событие не происходит. Если возвращается false , вызывается IsInputKey. . |
Проверьте специальный ключ, требующий предварительной обработки или обычного символьного ключа, который должен вызывать событие KeyDown и отправляться в элемент управления. | IsInputKey | Если метод возвращает true , это означает, что элемент управления на экране это обычный символ, а событие KeyDown вызывается. Если false , вызывается ProcessDialogKey.
Примечание: Чтобы убедиться, что элемент управления получает ключ или сочетание ключей, можно обрабатывать событие PreviewKeyDown и устанавливать IsInputKeyPreviewKeyDownEventArgs в true для необходимого ключа или ключей. |
Проверьте наличие клавиш навигации (ESC, TAB, Return или клавиши со стрелками). | 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. Например, вы хотите, чтобы табуляция и возврат обрабатывались в текстовом поле. | Переопределите IsInputKey.
Примечание. Кроме того, можно обрабатывать событие PreviewKeyDown и задавать IsInputKeyPreviewKeyDownEventArgs для true ключа или ключей. |
Выполните специальную обработку входных данных или навигации в элементе управления. Например, вы хотите использовать клавиши со стрелками в элементе управления списком, чтобы изменить выбранный элемент. | Переопределение ProcessDialogKey |
Перехватите клавишу навигации и вызовите событие KeyPress. Например, в элементе управления "spin-box" вы хотите, чтобы несколько нажатий клавиш со стрелками ускоряли перемещение по элементам. | Переопределить IsInputChar. |
Осуществите специальную обработку ввода или навигации во время события KeyPress. Например, в элементе управления списком, удерживая клавишу "r", перемещается между элементами, начинающимися с буквы "r". | Переопределение ProcessDialogChar |
Выполнение пользовательской обработки мнемоник; например, вы хотите обрабатывать мнемоники на кнопках с пользовательской прорисовкой, содержащихся на панели инструментов. | Переопределить ProcessMnemonic. |
См. также
.NET Desktop feedback