- Принцип работы ввод с клавиатуры How Keyboard Input Works
- Типы ключей Types of Keys
- Порядок событий клавиатуры Order of Keyboard Events
- Предварительная обработка сообщений клавиатуры Preprocessing Keys
- Предварительная обработка события KeyDown Preprocessing for a KeyDown event
- Предварительная обработка события KeyPress Preprocessing for a KeyPress Event
- Обработка сообщений клавиатуры Processing Keyboard Messages
- Переопределение методов клавиатуры Overriding Keyboard Methods
- Практическое руководство. Изменение ввода с клавиатуры в стандартном элементе управления How to: Modify Keyboard Input to a Standard Control
- Получение клавиши To consume a key
- Изменение стандартной символьной клавиши To modify a standard character key
- Изменение клавиши, не связанной со знаком To modify a noncharacter key
- Пример Example
- Компиляция кода Compiling the Code
Принцип работы ввод с клавиатуры 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 перечисления и соответствуют значениям, сопровождающим WM_CHAR и WM_SYSCHAR сообщения Windows. 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:
Пользователь отправляет ключ «a», этот ключ предварительно обрабатывается, отправляется и KeyDown возникает событие. The user pushes the «a» key, the key is preprocessed, dispatched, and a KeyDown event occurs.
Пользователь содержит ключ «a», этот ключ предварительно обработан, подготовлен к отправке, и 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.
Пользователь отпускает клавишу «a», ключ предварительно обрабатывается, отправляется и 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.
Предварительная обработка события KeyDown Preprocessing 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. |
Предварительная обработка события KeyPress Preprocessing 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 , событие Key не создается, в противном случае 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.
Практическое руководство. Изменение ввода с клавиатуры в стандартном элементе управления How to: Modify Keyboard Input to a Standard Control
Формы Windows Forms предоставляют возможность получать и изменять вводимые с клавиатуры данные. Windows Forms provides the ability to consume and modify keyboard input. Получением клавиши называется обработка клавиши внутри метода или обработчика событий таким образом, чтобы следующие методы и события в очереди сообщений не получали значение этой клавиши. Consuming a key refers to handling a key within a method or event handler so that other methods and events further down the message queue do not receive the key value. Изменением клавиши называется изменение значения клавиши таким образом, чтобы следующие методы и обработчики событий в очереди сообщений получали другое значение клавиши. Modifying a key refers to modifying the value of a key so that methods and event handlers further down the message queue receive a different key value. В этом разделе показано, как выполнять эти задачи. This topic shows how to accomplish these tasks.
Получение клавиши To consume a key
В обработчике событий KeyPress установите для свойства Handled класса KeyPressEventArgs значение true . In a KeyPress event handler, set the Handled property of the KeyPressEventArgs class to true .
В обработчике событий KeyDown установите для свойства Handled класса KeyEventArgs значение true . In a KeyDown event handler, set the Handled property of the KeyEventArgs class to true .
Установка свойства Handled в обработчике событий KeyDown не препятствует возникновению событий KeyPress и KeyUp для текущей клавиши. Setting the Handled property in the KeyDown event handler does not prevent the KeyPress and KeyUp events from being raised for the current keystroke. Для этой цели используется свойство SuppressKeyPress. Use the SuppressKeyPress property for this purpose.
В примере ниже показан фрагмент кода оператора switch , который проверяет свойство KeyChar класса KeyPressEventArgs, полученное обработчиком событий KeyPress. The following example is an excerpt from a switch statement that examines the KeyChar property of the KeyPressEventArgs received by a KeyPress event handler. Этот код получает клавиши со знаками «A» и «a». This code consumes the ‘A’ and ‘a’ character keys.
Изменение стандартной символьной клавиши To modify a standard character key
В обработчике событий KeyPress задайте для свойства KeyChar класса KeyPressEventArgs значение новой символьной клавиши. In a KeyPress event handler, set the KeyChar property of the KeyPressEventArgs class to the value of the new character key.
В примере ниже показан фрагмент кода оператора switch , изменяющего клавиши «B» на «A» и «b» на «a». The following example is an excerpt from a switch statement that modifies ‘B’ to ‘A’ and ‘b’ to ‘a’. Следует отметить, что для свойства Handled параметра KeyPressEventArgs установлено значение false , чтобы новое значение клавиши передавалось другим методам и событиям в очереди сообщений. Note that the Handled property of the KeyPressEventArgs parameter is set to false , so that the new key value is propagated to other methods and events in the message queue.
Изменение клавиши, не связанной со знаком To modify a noncharacter key
Переопределите метод Control, который обрабатывает сообщения Windows, найдите сообщение WM_KEYDOWN или WM_SYSKEYDOWN и установите для свойства WParam параметра Message значение Keys, представляющее новую клавишу, не связанную со знаком. Override a Control method that processes Windows messages, detect the WM_KEYDOWN or WM_SYSKEYDOWN message, and set the WParam property of the Message parameter to the Keys value that represents the new noncharacter key.
В примере кода ниже показано, как переопределить метод PreProcessMessage элемента управления для обнаружения клавиш с F1 по F9 и изменения нажатия клавиши F3 на F1. The following code example demonstrates how to override the PreProcessMessage method of a control to detect keys F1 through F9 and modify any F3 key press to F1. Дополнительные сведения о Control методах, которые можно переопределить для перехвата сообщений клавиатуры, см. в разделе Ввод данных пользователем в Windows Forms приложении и как работает ввод с клавиатуры. For more information on Control methods that you can override to intercept keyboard messages, see User Input in a Windows Forms Application and How Keyboard Input Works.
Пример Example
В примере ниже полностью представлено приложение для примеров кода из предыдущих разделов. The following code example is the complete application for the code examples in the previous sections. Для получения и изменения вводимых с клавиатуры данных в приложении используется пользовательский элемент управления, производный от класса TextBox. The application uses a custom control derived from the TextBox class to consume and modify keyboard input.
Компиляция кода Compiling the Code
Для этого примера требуются: This example requires: