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

Ввод с клавиатуры обрабатывается в Windows Forms посредством вызова событий клавиатуры в ответ на сообщения Windows.Windows Forms processes keyboard input by raising keyboard events in response to Windows messages. В большинстве приложений Windows Forms для обработки ввода с клавиатуры используются только события клавиатуры.Most Windows Forms applications process keyboard input exclusively by handling the keyboard events. Тем не менее, чтобы реализовать более сложные сценарии ввода с клавиатуры, например перехват клавиш до того, как они достигнут элемента управления, необходимо понимать, как работают сообщения клавиатуры.However, you need to understand how keyboard messages work so you can implement more advanced keyboard-input scenarios, such as intercepting keys before they reach a control. В этом разделе описываются типы данных ключа, распознаваемых приложением Windows Forms, и приводятся общие сведения о маршрутизацией сообщений клавиатуры.This topic describes the types of key data that Windows Forms recognizes and provides an overview of how keyboard messages are routed. Сведения о событиях клавиатуры см. в разделе Использование событий клавиатуры.For information about keyboard events, see Using Keyboard Events.

Типы ключейTypes of Keys

Windows Forms идентифицирует ввод с клавиатуры как коды виртуальных клавиш, представленных побитового Keys перечисления.Windows Forms identifies keyboard input as virtual-key codes that are represented by the bitwise Keys enumeration. С Keys перечисления, можно объединить ряд нажатых клавиш в одно значение.With the Keys enumeration, you can combine a series of pressed keys to result in a single value. Эти значения соответствуют значениям, сопровождающим сообщения Windows WM_KEYDOWN и WM_SYSKEYDOWN.These values correspond to the values that accompany the WM_KEYDOWN and WM_SYSKEYDOWN Windows messages. Нажатие большинства физических клавиш можно обнаружить, обработка KeyDown или KeyUp события.You can detect most physical key presses by handling the KeyDown or KeyUp events. Клавиши со знаками являются подмножеством Keys перечисления и соответствуют значениям, которые сопровождают сообщения Windows WM_CHAR и WM_SYSCHAR.Character keys are a subset of the Keys enumeration and correspond to the values that accompany the WM_CHAR and WM_SYSCHAR Windows messages. Если сочетание нажатых клавиш образует знак, его можно определить символ путем обработки KeyPress событий.If the combination of pressed keys results in a character, you can detect the character by handling the KeyPress event. Кроме того, можно использовать Keyboard, предоставляемый интерфейсом программирования Visual Basic, для обнаружения, которые были нажаты и отправка сочетания клавиш.Alternatively, you can use Keyboard, exposed by Visual Basic programming interface, to discover which keys were pressed and send keys. Дополнительные сведения см. в разделе Доступ к клавиатуре.For more information, see Accessing the Keyboard.

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

Как было показано ранее, в элементе управления могут возникать 3 связанных с клавиатурой события.As listed previously, there are 3 keyboard related events that can occur on a control. Общий порядок событий показывает следующая последовательность:The following sequence shows the general order of the events:

  1. Пользователь помещает клавиша «», предварительно обрабатывается, отправляется и KeyDown событием.The user pushes the "a" key, the key is preprocessed, dispatched, and a KeyDown event occurs.

  2. Пользователь удерживает клавишу «», предварительно обрабатывается, отправляется и KeyPress событием.The user holds the "a" key, the key is preprocessed, dispatched, and a KeyPress event occurs.

    Пока пользователь удерживает нажатой данную клавишу, это событие возникает несколько раз.This event occurs multiple times as the user holds a key.

  3. Пользователь отпускает клавиша «», ключ предварительно обрабатывается, отправляется и KeyUp событием.The user releases the "a" key, the key is preprocessed, dispatched and a KeyUp event occurs.

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

Как и другие сообщения, сообщения клавиатуры обрабатываются в WndProc метод формы или элемента управления.Like other messages, keyboard messages are processed in the WndProc method of a form or control. Тем не менее, прежде чем клавиатуры обработки сообщений, PreProcessMessage метод вызывает один или несколько методов, которые могут быть переопределены для обработки специальных символов и физических клавиш.However, before keyboard messages are processed, the PreProcessMessage method calls one or more methods that can be overridden to handle special character keys and physical keys. Эти методы можно переопределить для обнаружения и фильтрации определенных клавиш перед обработкой сообщения элементом управления.You can override these methods to detect and filter certain keys before the messages are processed by the control. В следующей таблице показаны выполняемые действия и связанные методы в порядке их осуществления.The following table shows the action that is being performed and the related method that occurs, in the order that the method occurs.

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

ДействиеAction Связанный методRelated method ПримечанияNotes
Проверка клавиши для команд, например ярлыка для сочетаний клавиш или меню.Check for a command key such as an accelerator or menu shortcut. ProcessCmdKey Этот метод обрабатывает клавишу для команд, которая имеет приоритет над обычными клавишами.This method processes a command key, which takes precedence over regular keys. Если этот метод возвращает true, сообщение о нажатии клавиши не отправляется, и событие клавиши не возникает.If this method returns true, the key message is not dispatched and a key event does not occur. Если он возвращает false, IsInputKey вызывается.If it returns false, IsInputKey is called.
Проверка наличия специальной клавишей, нуждающейся в предварительной обработке или ключ обычный символ, который должен вызывать KeyDown событий и отправлена в элемент управления.Check for a special key that requires preprocessing or a normal character key that should raise a KeyDown event and be dispatched to a control. IsInputKey Если метод возвращает true, это означает, что элемент управления является обычный символ и KeyDown события.If the method returns true, it means the control is a regular character and a KeyDown event is raised. Если false, ProcessDialogKey вызывается.If false, ProcessDialogKey is called. Примечание: чтобы элемент управления получает ключ или сочетание клавиш, можно обработать PreviewKeyDown событий и набор IsInputKey из PreviewKeyDownEventArgs для true для клавишу или клавиши, которые вы хотите.Note: To ensure a control gets a key or combination of keys, you can handle the PreviewKeyDown event and set IsInputKey of the PreviewKeyDownEventArgs to true for the key or keys you want.
Проверка клавиши навигации (ESC, TAB, ВВОД или клавиши со стрелками).Check for a navigation key (ESC, TAB, Return, or arrow keys). ProcessDialogKey Этот метод обрабатывает физическую клавишу со специальными функциональными возможностями в элементе управления, например переключение фокуса между элементом управления и его родительским объектом.This method processes a physical key that employs special functionality within the control, such as switching focus between the control and its parent. Если непосредственный элемент управления не обрабатывает ключ ProcessDialogKey вызывается для родительского элемента управления и так далее до самого верхнего элемента управления в иерархии.If the immediate control does not handle the key, the ProcessDialogKey is called on the parent control and so on to the topmost control in the hierarchy. Если этот метод возвращает true, предварительная обработка завершается, и событие клавиатуры не возникает.If this method returns true, preprocessing is complete and a key event is not generated. Если он возвращает false, KeyDown событием.If it returns false, a KeyDown event occurs.

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

ДействиеAction Связанный методRelated method ПримечанияNotes
Убедитесь, что клавиша является обычным символом, который должен быть обработан элементом управленияCheck to see the key is a normal character that should be processed by the control IsInputChar Если символ является обычный символ, этот метод возвращает true, KeyPress событие и никаких дальнейших предварительной обработки происходит.If the character is a normal character, this method returns true, the KeyPress event is raised and no further preprocessing occurs. В противном случае ProcessDialogChar будет вызван.Otherwise ProcessDialogChar will be called.
Проверьте, не является ли символ назначенной клавишей (например, &OK на кнопке)Check to see if the character is a mnemonic (such as &OK on a button) ProcessDialogChar Этот метод аналогичен методу ProcessDialogKey, будет вызываться вверх по иерархии элементов управления.This method, similar to ProcessDialogKey, will be called up the control hierarchy. Если элемент управления является контейнером, он проверяет наличие сокращения путем вызова ProcessMnemonic на себя и своих дочерних элементах управления.If the control is a container control, it checks for mnemonics by calling ProcessMnemonic on itself and its child controls. Если ProcessDialogChar возвращает true, KeyPress событие не происходит.If ProcessDialogChar returns true, a KeyPress event does not occur.

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

После сообщения клавиатуры достигают WndProc метод формы или элемента управления, они обрабатываются набор методов, которые могут быть изменены.After keyboard messages reach the WndProc method of a form or control, they are processed by a set of methods that can be overridden. Каждый из этих методов возвращает Boolean значение, указывающее, является ли сообщение клавиатуры обработан и получено элементом управления.Each of these methods returns a Boolean value specifying whether the keyboard message has been processed and consumed by the control. Если один из методов возвращает true, сообщение считается обработанным и не передается в базовый или родительский объект элемента управления для дальнейшей обработки.If one of the methods returns true, then the message is considered handled, and it is not passed to the control's base or parent for further processing. В противном случае сообщение остается в очереди сообщений и может быть обработано в другом методе в базовом или родительском объекте элемента управления.Otherwise, the message stays in the message queue and may be processed in another method in the control's base or parent. В следующей таблице представлены методы, обеспечивающие обработку сообщений клавиатуры.The following table presents the methods that process keyboard messages.

МетодMethod ПримечанияNotes
ProcessKeyMessage Этот метод обрабатывает все сообщения клавиатуры, полученных WndProc метод элемента управления.This method processes all keyboard messages that are received by the WndProc method of the control.
ProcessKeyPreview Этот метод отправляет сообщение клавиатуры в родительский объект элемента управления.This method sends the keyboard message to the control's parent. Если ProcessKeyPreview возвращает true, событие не ключа формируется ProcessKeyEventArgs вызывается.If ProcessKeyPreview returns true, no key event is generated, otherwise ProcessKeyEventArgs is called.
ProcessKeyEventArgs Этот метод вызывает KeyDown, KeyPress, и KeyUp соответствующие события.This method raises the KeyDown, KeyPress, and KeyUp events, as appropriate.

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

Существует множество методов переопределения, когда выполняется предварительная и основная обработка сообщений клавиатуры. Тем не менее некоторые методы отличаются большим удобством.There are many methods available for overriding when a keyboard message is preprocessed and processed; however, some methods are much better choices than others. В таблице ниже приведены задачи, которые может быть необходимо выполнить, и оптимальные способы переопределения методов для сообщений клавиатуры.Following table shows tasks you might want to accomplish and the best way to override the keyboard methods. Дополнительные сведения о переопределении методов см. в разделе переопределение свойств и методов в производных классах.For more information on overriding methods, see Overriding properties and methods in derived classes.

ЗадачаTask МетодMethod
Перехват клавиши перехода и вызвать KeyDown событий.Intercept a navigation key and raise a KeyDown event. Например, в текстовом поле необходимо обработать клавиши TAB и Return.For example you want TAB and Return to be handled in a text box. Переопределите метод IsInputKey.Override IsInputKey. Примечание: в качестве альтернативы можно обрабатывать PreviewKeyDown событий и набор IsInputKey из PreviewKeyDownEventArgs для true для клавишу или клавиши, которые вы хотите.Note: Alternatively, you can handle the PreviewKeyDown event and set IsInputKey of the PreviewKeyDownEventArgs to true for the key or keys you want.
Выполнение специальной обработки ввода или навигации в элементе управления.Perform special input or navigation handling on a control. Например, необходимо использовать клавиши со стрелками в элементе управления "Список", чтобы изменить выбранный элемент.For example, you want the use of arrow keys in your list control to change the selected item. Переопределите метод ProcessDialogKey.Override ProcessDialogKey
Перехват клавиши перехода и вызвать KeyPress событий.Intercept a navigation key and raise a KeyPress event. Например, в элементе управления регулятора требуется выполнение нескольких нажатий клавиши со стрелкой для ускорения перехода между элементами.For example in a spin-box control you want multiple arrow key presses to accelerate progression through the items. Переопределите метод IsInputChar.Override IsInputChar.
Специальные ввода или Обработка переходов во время выполнения KeyPress событий.Perform special input or navigation handling during a KeyPress event. Например, в элементе управления "Список" при удержании нажатой клавиши "r" следует переходить между элементами, которые начинаются с буквы "r".For example, in a list control holding down the "r" key skips between items that begin with the letter r. Переопределите метод ProcessDialogChar.Override ProcessDialogChar
Выполнение обработки пользовательских назначенных клавиш. Например, необходимо обрабатывать назначенные клавиши на кнопках, нарисованных владельцем, содержащихся на панели инструментов.Perform custom mnemonic handling; for example, you want to handle mnemonics on owner-drawn buttons contained in a toolbar. Переопределите метод ProcessMnemonic.Override ProcessMnemonic.

См. такжеSee Also

Keys
WndProc
PreProcessMessage
Объект My.Computer.KeyboardMy.Computer.Keyboard Object
Доступ к клавиатуреAccessing the Keyboard
Использование событий клавиатурыUsing Keyboard Events