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

В компьютерных играх и не только часто используют нажатие одной или нескольких (комбинаций) клавиш.
Известно, что нажатия клавиш (далее — ключевые события) происходят в следующем порядке:
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(); ;
   }
 }
}


NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
7 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

не работает. ты пидорас

Пиздец полный

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

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

Важно: Вы можете поддержать проект и автора.

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

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

Важно: Вы можете поддержать проект и автора.
7
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x