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