Пример обработки событий «Нажатие клавиш»

В компьютерных играх и не только часто используют нажатие одной или нескольких (комбинаций) клавиш.
Известно, что нажатия клавиш (далее — ключевые события) происходят в следующем порядке:
1) KeyDown
2) KeyPress
3) KeyUp
То есть, если Вы клавишу нажали, но не отпустили, событие KeyUp не наступает.
Заметим, что KeyPress-событие не вызывается несимвольными ключами, отличными от пробела и Backspace; однако, несимвольные ключи вызывают события KeyDown и KeyUp. Обязательно задайте свойство Form1.KePreview=true для получения реакции на клавишу — событие Control.KeyPress.

Используйте свойство KeyChar для выборки сочетаний клавиш во время выполнения, а также для использования или изменения подмножества распространенных нажатий клавиш.

Чтобы обрабатывать события клавиатуры только на уровне формы и не включать другие элементы управления для получения событий клавиатуры, задайте KeyPressEventArgs.Handled для свойства в KeyPress-методе обработки событий формы значение true.

Приведенные примеры методов обработки этих событий помогут Вам решить любые задачи:

using System.Windows.Forms;
namespace PressAnyKey
{
public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();
   }
// При нажатии клавиш ALt+F (F в любых раскладках и регистрах)
   private void Form1_KeyDown(object sender, KeyEventArgs e)
   {
      if (e.Alt && e.KeyCode == Keys.F)
         label1.Text = "Alt + F: " + e.Alt.ToString() + " - " + e.KeyCode.ToString();
   }
// При нажатии клавиш Shift + Control + Z (Z в любых раскладках и регистрах)
   private void Form1_KeyUp(object sender, KeyEventArgs e)
   {
      if (e.Shift && e.Control && e.KeyCode == Keys.Z)
         label1.Text = "Shift + Control + Z - " + e.KeyCode.ToString();
   }
// Происходит при нажатии клавиши с буквой, пробела или клавиши BACKSPACE, если фокус находится в элементе управления.
// e.KeyChar возвращает полный код нажатой клавиши, в примере а/А/ф/Ф
   private void Form1_KeyPress(object sender, KeyPressEventArgs e)
   {
      if ((e.KeyChar == 'a') | (e.KeyChar == 'A') | (e.KeyChar == 'ф') | (e.KeyChar == 'Ф'))
         label1.Text = "AaФф - " + e.KeyChar.ToString(); ;
   }
 }
}

5 комментариев к “Пример обработки событий «Нажатие клавиш»”

  1. Пример, сам по себе, является образцом как не нужно делать, между проверкой и вызовом, может произойти отписывание от события и тогда получим NullReferenceException. Выходов из этой ситуации ровно два. Первый — копируем событие в локальную переменную и работаем с ней, второй — в месте инициализации класса добавляем пустой обработчик для события, исключая ситуацию, когда на него никто не подписан и оно равно null.

    1. Вячеслав Рычков

      Олеся, согласен с Вами, но это был простейший пример. Пусть сначала возникнет исключение в программе.

      1. Антон

        А можно пояснить, в чем проблема? Не совсем понял, что значит «между проверкой и вызовом» и в чем состоит проблема? (как и вариант ее решения)

        Если форма подписана на KeyDown, то это событие обрабатывается.
        Если форма в какой-то момент отпишется от события — обработчик перестанет вызывать и все.
        Что я упускаю?

        1. Вячеслав Рычков

          Антон! Вы верно отметили: Есть событие возникло и с ним связан метод — оно обрабатывается, нет связи — нет обработки. Другой вопрос, если в однопоточном приложении возникает несколько событий и как их обрабатывать. В моем примере нажатие на клавишу изменяет содержимое textBox (это только для иллюстрации было), но чаще нажатие клавиши связывают с движением и перерисовкой объекта (игрока), которая может занять заметное время, поэтому можно дирижировать событиями.

  2. Светлана

    Извините можете объяснить как Правильно а не ПРОСТО сделать действие на нажатие клавиши?
    Заранее спасибо за ответ!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх