Общие сведения об использовании клавиатуры (Windows Forms .NET)

В Windows Forms вводимые пользователем данные отправляются в приложения в виде сообщений Windows. Ряд переопределяемых методов обрабатывает эти сообщения на уровне приложения, формы и элемента управления. Когда эти методы получают сообщения клавиатуры, они вызывают события, которые могут быть обработаны для получения сведений о вводе с помощью клавиатуры. Во многих случаях приложения Windows Forms способны обрабатывать все вводимые пользователем данные, просто обрабатывая эти события. В других случаях может потребоваться переопределить в приложении один из методов, обрабатывающих сообщения, чтобы перехватить конкретное сообщение, прежде чем оно будет получено приложением, формой или элементом управления.

Важно!

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

События клавиатуры

Все элементы управления Windows Forms наследуют набор событий, связанных с вводом с помощью мыши и клавиатуры. Например, элемент управления может обработать событие KeyPress, чтобы определить код символа нажатой клавиши. Дополнительные сведения см. в разделе об использовании событий клавиатуры.

Методы, обрабатывающие сообщения ввода пользователя

Формы и элементы управления имеют доступ к интерфейсу IMessageFilter и набору переопределяемых методов, которые обрабатывают сообщения Windows в различных точках очереди сообщений. Все эти методы имеют параметр Message, который инкапсулирует низкоуровневые сведения о сообщениях Windows. Можно реализовать или переопределить эти методы, чтобы проанализировать сообщение, а затем либо использовать сообщение, либо передать его следующему потребителю в очереди сообщений. В следующей таблице представлены методы, обрабатывающие все сообщения Windows в Windows Forms.

Способ Примечания.
PreFilterMessage Метод перехватывает сообщения в очереди (также известные как отправленные сообщения) на уровне приложения.
PreProcessMessage Метод перехватывает сообщения Windows на уровне формы и элемента управления до их обработки.
WndProc Метод обрабатывает сообщения Windows на уровне формы и элемента управления.
DefWndProc Метод выполняет обработку сообщений Windows по умолчанию на уровне формы и элемента управления. Это обеспечивает минимальную функциональность окна.
OnNotifyMessage Метод перехватывает сообщения на уровне формы и элемента управления после их обработки. Для вызова этого метода необходимо задать бит стиля EnableNotifyMessage.

Сообщения клавиатуры и мыши также обрабатываются дополнительным набором переопределяемых методов, характерных для этих типов сообщений. Дополнительные сведения см. в разделе о предварительной обработке ключей. .

Типы ключей

Windows Forms идентифицирует ввод с клавиатуры как коды виртуальных клавиш, представляемые побитовым перечислением Keys. Перечисление Keys позволяет объединять несколько нажатых клавиш в виде одиночного значения. Эти значения соответствуют значениям, сопровождающим сообщения Windows WM_KEYDOWN и WM_SYSKEYDOWN. Большинство физических нажатий клавиш можно обнаружить, обрабатывая события KeyDown или KeyUp. Клавиши знаков являются подмножеством перечисления Keys и соответствуют значениям, сопровождающим сообщения Windows WM_CHAR и WM_SYSCHAR. Если сочетание нажатых клавиш образует знак, его можно обнаружить путем обработки события KeyPress.

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

Как было показано ранее, в элементе управления могут возникать 3 связанных с клавиатурой события. Общий порядок событий показывает следующая последовательность:

  1. Пользователь нажимает клавишу "a". Она предварительно обрабатывается, подготавливается к отправке, и происходит событие KeyDown.
  2. Пользователь удерживает нажатой клавишу "a". Она предварительно обрабатывается, подготавливается к отправке, и происходит событие KeyPress. Пока пользователь удерживает нажатой данную клавишу, это событие возникает несколько раз.
  3. Пользователь отпускает клавишу "a". Она предварительно обрабатывается, подготавливается к отправке, и происходит событие KeyUp.

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

Как и другие сообщения, обработка сообщений клавиатуры выполняется в методе WndProc формы или элемента управления. Тем не менее перед обработкой сообщений клавиатуры метод PreProcessMessage вызывает один или несколько методов, которые могут быть переопределены для обработки специальных знаков и физических клавиш. Эти методы можно переопределить для обнаружения и фильтрации определенных клавиш перед обработкой сообщения элементом управления. В следующей таблице показаны выполняемые действия и связанные методы в порядке их осуществления.

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

Действие Связанный метод Примечания.
Проверка клавиши для команд, например ярлыка для сочетаний клавиш или меню. ProcessCmdKey Этот метод обрабатывает клавишу для команд, которая имеет приоритет над обычными клавишами. Если этот метод возвращает true, сообщение о нажатии клавиши не отправляется, и событие клавиши не возникает. Если он возвращает false, вызывается IsInputKey.
Проверка специальной клавиши, для которой требуется предварительная обработка, или обычной клавиши знака, которая должна вызывать событие KeyDown и отправляться в элемент управления. IsInputKey Если метод возвращает true, это означает, что элементом управления является обычный символ, и возникает событие KeyDown. Если значение равно false, вызывается ProcessDialogKey. Примечание. Чтобы элемент управления мог получить события нажатия клавиши или сочетания клавиш, можно выполнить обработку события PreviewKeyDown и установить для поля IsInputKey объекта PreviewKeyDownEventArgs значение true для необходимых клавиш.
Проверка клавиши навигации (ESC, TAB, ВВОД или клавиши со стрелками). 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.

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

Существует множество методов переопределения, когда выполняется предварительная и основная обработка сообщений клавиатуры. Тем не менее некоторые методы отличаются большим удобством. В таблице ниже приведены задачи, которые может быть необходимо выполнить, и оптимальные способы переопределения методов для сообщений клавиатуры. Дополнительные сведения о переопределении методов см. в разделе Наследование (Руководство по программированию на C#) или Наследование (Visual Basic).

Задача Способ
Перехватить клавишу навигации и создать событие KeyDown. Например, в текстовом поле необходимо обработать клавиши TAB и Return. Переопределите IsInputKey. Примечание. Можно также обработать событие PreviewKeyDown и установить для IsInputKey объекта PreviewKeyDownEventArgs значение true для необходимой клавиши или клавиш.
Выполнение специальной обработки ввода или навигации в элементе управления. Например, необходимо использовать клавиши со стрелками в элементе управления "Список", чтобы изменить выбранный элемент. Переопределите метод ProcessDialogKey.
Перехватить клавишу навигации и создать событие KeyPress. Например, в элементе управления регулятора требуется выполнение нескольких нажатий клавиши со стрелкой для ускорения перехода между элементами. Переопределите IsInputChar.
Выполнить специальный ввод или обработку навигации во время события KeyPress. Например, в элементе управления "Список" при удержании нажатой клавиши "r" следует переходить между элементами, которые начинаются с буквы "r". Переопределите метод ProcessDialogChar.
Выполнение обработки пользовательских назначенных клавиш. Например, необходимо обрабатывать назначенные клавиши на кнопках, нарисованных владельцем, содержащихся на панели инструментов. Переопределите ProcessMnemonic.

См. также