Как отследить нажатие клавиши c
К событиям клавиатуры можно отнести следующие события:
Возникает при нажатии клавиши
Возникает при нажатии клавиши
Возникает при освобождении клавиши
Возникает при освобождении клавиши
Возникает при получении элементом текстового ввода (генерируется не только клавиатурой, но и стилусом)
Возникает при получении элементом текстового ввода
Большинство событий клавиатуры (KeyUp/PreviewKeyUp, KeyDown/PreviewKeyDown) принимает в качестве аргумента объект KeyEventArgs, у которого можно отметить следующие свойства:
Key позволяет получить нажатую или отпущенную клавишу
SystemKey позволяет узнать, нажата ли системная клавиша, например, Alt
KeyboardDevice получает объект KeyboardDevice, представляющее устройство клавиатуры
IsRepeat указывает, что клавиша удерживается в нажатом положении
IsUp и IsDown указывает, была ли клавиша нажата или отпущена
IsToggled указывает, была ли клавиша включена — относится только к включаемым клавишам Caps Lock, Scroll Lock, Num Lock
Например, обработаем событие KeyDown для текстового поля и выведем данные о нажатой клавише в текстовый блок:
А в файле кода пропишем обработчик TextBox_KeyDown :
Здесь в текстовый блок добавляется текстовое представление нажатой клавиши в текстовом поле:

Правда, в данном случае реальную пользу от текстового представления мы можем получить только для алфавитно-цифровых клавиш, в то время как при нажатии специальных клавиш или кавычек будут добавляться их полные текстовые представления, например, для кавычек — OemQuotes.
Если нам надо отловить нажатие какой-то опредленной клавиши, то мы можем ее проверить через перечисление Key :
Объект KeyboardDevice позволяет нам получить ряд дополнительных данных о собыиях клавиатуры через ряд свойств и методов:
Modifiers позволяет узнать, какая клавиша была нажата вместе с основной (Ctrl, Shift, Alt)
IsKeyDown() определяет, была ли нажата определенная клавиша во время события
IsKeyUp() позволяет узнать, была ли отжата определенная клавиша во время события
IsKeyToggled() позволяет узнать, была ли во время события включена клавиша Caps Lock, Scroll Lock или Num Lock
GetKeyStates() возвращает одно из значений перечисления KeyStates, которое указывает на состояние клавиши
Пример использования KeyEventArgs при одновременном нажатии двух клавиш Shift и F1:
События TextInput/PreviewTextInput в качестве параметра принимают объект TextCompositionEventArgs . Из его свойств стоит отметить, пожалуй, только свойство Text , которое получает введенный текст, именно текст, а не текстовое представление клавиши. Для этого добавим к текстовому полю обработчик:
И определим обработчик в файле кода:
Причем в данном случае я обрабатываю именно событие PreviewTextInput, а не TextInput, так как элемент TextBox подавляет событие TextInput, и вместо него генерирует событие TextChanged. Для большинства других элементов управления, например, кнопок, событие TextInput прекрасно срабатывает.
Валидация текстового ввода
События открывают нам большой простор для валидации текстового ввода. Нередко при вводе используются те или иные ограничения: нельзя вводить цифровые символы или, наоборот, можно только цифровые и т.д. Посмотрим, как мы можем провети валидацию ввода. К примеру, возьмем ввод номера телефона. Сначала зададим обработку двух событий в xaml:
И определим в файле кода обработчики:
Для валидации ввода нам надо использовать обработчики для двух событий — PreviewKeyDown и PreviewTextInput. Дело в том, что нажатия не всех клавиш PreviewTextInput обрабатывает. Например, нажатие на клавишу пробела не обрабтывается. Поэтому также применяется обработка и PreviewKeyDown.
Перехватываем нажатия клавиш в C#
В этой статье мы напишем такую программу, с помощью которой можно будет отслеживать нажатия клавиш и сохранять их в файл. Такое приложение можно использовать, к примеру, чтобы подшутить над своим другом, показав ему, что знаете, что он пишет, когда вас нет рядом. По сути дела нам требуется кейлоггер, но легальный, который можно использовать только законно. Итак, формулируем задачу:
В строках 24-25 задаем массивы соответствия раскладок клавиатуры — мы ж ориентированы на русскоязычную аудиторию. Пишем нажатия в файл WriteText.txt. Незаметность обеспечивается скрытием консоли (приложение консольное). Код тестировался в Microsoft Visual C# 2010, Microsoft .NET Framework 4.
Итак, теперь мы умеем перехватывать нажатия клавиш и записывать их в файл. Если у вас есть какие-либо вопросы по данному коду, или вообще по C#, или требуется какая-либо программа, то вы можете написать на почту up777up@yandex.ru — вам за вознаграждение в денежном эквиваленте обязательно помогут.
Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
статьи IT, си шарп, кейлоггер
Пример обработки событий «Нажатие клавиш»
В компьютерных играх и не только часто используют нажатие одной или нескольких (комбинаций) клавиш.
Известно, что нажатия клавиш (далее — ключевые события) происходят в следующем порядке:
1) KeyDown
2) KeyPress
3) KeyUp
То есть, если Вы клавишу нажали, но не отпустили, событие KeyUp не наступает.
Заметим, что KeyPress-событие не вызывается несимвольными ключами, отличными от пробела и Backspace; однако, несимвольные ключи вызывают события KeyDown и KeyUp. Обязательно задайте свойство Form1.KePreview=true для получения реакции на клавишу — событие Control.KeyPress.
Используйте свойство KeyChar для выборки сочетаний клавиш во время выполнения, а также для использования или изменения подмножества распространенных нажатий клавиш.
Чтобы обрабатывать события клавиатуры только на уровне формы и не включать другие элементы управления для получения событий клавиатуры, задайте KeyPressEventArgs.Handled для свойства в KeyPress-методе обработки событий формы значение true.
Приведенные примеры методов обработки этих событий помогут Вам решить любые задачи:
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
События ввода с клавиатуры

Когда пользователь нажимает клавишу, возникает целая серия событий. В таблице эти события перечислены в порядке их возникновения:
| Имя | Тип маршрутизации | Описание |
|---|---|---|
| PreviewKeyDown | Туннелирование | Возникает при нажатии клавиши. |
| KeyDown | Пузырьковое распространение | То же |
| PreviewTextInput | Туннелирование | Возникает, когда нажатие клавиши завершено, и элемент получает текстовый ввод. Это событие не возникает для тех клавиш, которые не «печатают» символы (например, оно не возникает при нажатии клавиш <Ctrl>, <Shift>, <Backspace>, клавиш управления курсором, функциональных клавиш и т.д.) |
| TextInput | Пузырьковое распространение | То же |
| PreviewKeyUp | Туннелирование | Возникает при отпускании клавиши |
| KeyUp | Пузырьковое распространение | То же |
Обработка событий клавиатуры отнюдь не так легка, как это может показаться. Некоторые элементы управления могут блокировать часть этих событий, чтобы выполнять свою собственную обработку клавиатуры. Наиболее ярким примером является элемент TextBox, который блокирует событие TextInput, а также событие KeyDown для нажатия некоторых клавиш, таких как клавиши управления курсором. В подобных случаях обычно все-таки можно использовать туннелируемые события (PreviewTextlnput и PreviewKeyDown).
Элемент TextBox добавляет одно новое событие — TextChanged. Это событие возникает сразу после того, как нажатие клавиши приводит к изменению текста в текстовом поле. Однако в этот момент новый текст уже видим в текстовом поле, потому отменять нежелательное нажатие клавиши уже поздно.
Обработка нажатия клавиши
Понять, как работают и используются события клавиатуры, лучше всего на примере. Ниже представлен пример программы, которая отслеживает и протоколирует все возможные нажатия клавиш, когда в фокусе находится текстовое поле. В данном случае показан результат ввода заглавной буквы S.
Этот пример демонстрирует один важный момент. События PreviewKeyDown и KeyDown возникают при каждом нажатии клавиши. Однако событие TextInput возникает только тогда, когда в элементе был «введен» символ. На самом деле это может означать нажатие многих клавиш. В примере, нужно нажать две клавиши, чтобы получить заглавную букву S: сначала клавишу <Shift>, а затем клавишу <S>. В результате получаются по два события KeyDown и KeyUp, но только одно событие TextInput.

Каждое из событий PreviewKeyDown, KeyDown, PreviewKey и KeyUp передает объекту KeyEventArgs одну и ту же информацию. Самой важной ее частью является свойство Key, которое возвращает значение из перечисления System.Windows.Input.Key и идентифицирует нажатую или отпущенную клавишу.
Значение Key не учитывает состояние любой другой клавиши — например, была ли прижата клавиша <Shift> в момент нажатия <S>; в любом случае вы получите одно и то же значение Key (Key.S).
Здесь присутствует одна сложность. В зависимости от настройки клавиатуры в Windows, удержание клавиши в прижатом состоянии приводит к повторам нажатия после короткого промежутка времени. Например, прижатие клавиши <S> приведет к вводу в текстовое поле целой серии символов S. Точно так же прижатие клавиши <Shift> приводит к повторам нажатия и возникновению серии событий KeyDown. В реальном примере при нажатии комбинации <Shift+S> текстовое поле сгенерирует серию событий KeyDown для клавиши <Shift>, потом событие KeyDown для клавиши <S>, событие TextInput (или событие TextChanged в случае текстового поля), а затем событие KeyUp для клавиш <Shift> и <S>. Если нужно игнорировать повторы нажатия клавиши <S>, то можно проверить, является ли нажатие результатом прижатия клавиши, с помощью свойства KeyEventArgs.IsRepeat.
События PreviewKeyDown, KeyDown, PreviewKey и KeyUp больше подходят для написания низкоуровневого кода обработки ввода с клавиатуры (что редко бывает нужно — разве что в пользовательских элементах управления) и обработки нажатий специальных клавиш (например, функциональных).
За событием KeyDown следует событие PreviewTextInput. (Событие TextInput не возникает, поскольку элемент TextBox блокирует его.) В этот момент текст еще не отображается в элементе управления.
Событие TextInput обеспечивает код объекта TextCompositionEventArgs. Этот объект содержит свойство Text, которое дает обработанный текст, подготовленный к передаче элементу управления.
В идеале событие PreviewTextInput можно было бы использовать для выполнения проверки в элементах управления наподобие TextBox. Например, если вы создаете текстовое поле для ввода только чисел, можно проверить, не была ли введена при текущем нажатии клавиши буква, и установить флаг Handled, если это так. Увы — событие PreviewTextIlnput не генерируется для некоторых клавиш, которые бывает нужно обрабатывать. Например, при нажатии клавиши пробела в текстовом поле событие PreviewTextInput вообще пропускается. Это означает, что придется обрабатывать также событие PreviewKeyDown.
К сожалению, трудно реализовать надежную логику проверки данных в обработчике события PreviewKeyDown, т.к. в наличии имеется только значение Key, а это слишком низкоуровневый фрагмент информации. Например, в перечислении Key различаются клавиши цифровой клавиатуры (блок, предназначенный для ввода только цифр) и обычной клавиатуры. Это означает, что в зависимости от того, где нажата клавиша с цифрой 9, вы получите или значение Key.D9, или значение Key.NumPad9. Проверка всех допустимых значений как минимум очень утомительна.
Одним из выходов является использование класса KeyConverter, который позволяет преобразовать значение Key в более полезную строку. Например, вызов функции KeyConverter.ConvertToString() с любым из значений Key.D9 и Key.NumPad9 возвращает строковый результат «9». Вызов преобразования Key.ToString() дает менее полезное имя перечисления (либо «D9», либо «NumPad9»):
Однако использовать KeyConverter тоже не очень удобно, поскольку приходится обрабатывать длинные строки (например, «Backspace») для тех нажатий клавиш, которые не приводят к вводу текста.
Наиболее подходящим вариантом является обработка события PreviewTextlnput (где выполняется большая часть проверки) в сочетании с событием PreviewKeyDown для нажатий тех клавиш, которые не генерируют событие PreviewTextInput в текстовом поле (например, пробела).