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

Когда пользователь нажимает клавишу, возникает целая серия событий. В таблице эти события перечислены в порядке их возникновения:
| Имя | Тип маршрутизации | Описание |
|---|---|---|
| PreviewKeyDown | Туннелирование | Возникает при нажатии клавиши. |
| KeyDown | Пузырьковое распространение | То же |
| PreviewTextInput | Туннелирование | Возникает, когда нажатие клавиши завершено, и элемент получает текстовый ввод. Это событие не возникает для тех клавиш, которые не «печатают» символы (например, оно не возникает при нажатии клавиш , , , клавиш управления курсором, функциональных клавиш и т.д.) |
| TextInput | Пузырьковое распространение | То же |
| PreviewKeyUp | Туннелирование | Возникает при отпускании клавиши |
| KeyUp | Пузырьковое распространение | То же |
Обработка событий клавиатуры отнюдь не так легка, как это может показаться. Некоторые элементы управления могут блокировать часть этих событий, чтобы выполнять свою собственную обработку клавиатуры. Наиболее ярким примером является элемент TextBox, который блокирует событие TextInput, а также событие KeyDown для нажатия некоторых клавиш, таких как клавиши управления курсором. В подобных случаях обычно все-таки можно использовать туннелируемые события (PreviewTextlnput и PreviewKeyDown).
Элемент TextBox добавляет одно новое событие — TextChanged. Это событие возникает сразу после того, как нажатие клавиши приводит к изменению текста в текстовом поле. Однако в этот момент новый текст уже видим в текстовом поле, потому отменять нежелательное нажатие клавиши уже поздно.
Обработка нажатия клавиши
Понять, как работают и используются события клавиатуры, лучше всего на примере. Ниже представлен пример программы, которая отслеживает и протоколирует все возможные нажатия клавиш, когда в фокусе находится текстовое поле. В данном случае показан результат ввода заглавной буквы S.
Этот пример демонстрирует один важный момент. События PreviewKeyDown и KeyDown возникают при каждом нажатии клавиши. Однако событие TextInput возникает только тогда, когда в элементе был «введен» символ. На самом деле это может означать нажатие многих клавиш. В примере, нужно нажать две клавиши, чтобы получить заглавную букву S: сначала клавишу , а затем клавишу . В результате получаются по два события KeyDown и KeyUp, но только одно событие TextInput.
Игнорировать повторное нажатие символов
public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); >private void Clear_Click(object sender, RoutedEventArgs e) < lbxEvents.Items.Clear(); txtContent.Clear(); i = 0; >protected int i = 0; private void KeyEvents(object sender, KeyEventArgs e) < if ((bool)chkIgnoreRepeat.IsChecked && e.IsRepeat) return; i++; string s = "Event" + i + ": " + e.RoutedEvent + " Клавиша: " + e.Key; lbxEvents.Items.Add(s); >private void TextInputEvent(object sender, TextCompositionEventArgs e) < i++; string s = "Event" + i + ": " + e.RoutedEvent + " Клавиша: " + e.Text; lbxEvents.Items.Add(s); >>

Каждое из событий PreviewKeyDown, KeyDown, PreviewKey и KeyUp передает объекту KeyEventArgs одну и ту же информацию. Самой важной ее частью является свойство Key, которое возвращает значение из перечисления System.Windows.Input.Key и идентифицирует нажатую или отпущенную клавишу.
Значение Key не учитывает состояние любой другой клавиши — например, была ли прижата клавиша в момент нажатия ; в любом случае вы получите одно и то же значение Key (Key.S).
Здесь присутствует одна сложность. В зависимости от настройки клавиатуры в Windows, удержание клавиши в прижатом состоянии приводит к повторам нажатия после короткого промежутка времени. Например, прижатие клавиши приведет к вводу в текстовое поле целой серии символов S. Точно так же прижатие клавиши приводит к повторам нажатия и возникновению серии событий KeyDown. В реальном примере при нажатии комбинации текстовое поле сгенерирует серию событий KeyDown для клавиши , потом событие KeyDown для клавиши , событие TextInput (или событие TextChanged в случае текстового поля), а затем событие KeyUp для клавиш и . Если нужно игнорировать повторы нажатия клавиши , то можно проверить, является ли нажатие результатом прижатия клавиши, с помощью свойства 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 converter = new KeyConverter(); string key = converter.ConvertToString(e.Key);
Однако использовать KeyConverter тоже не очень удобно, поскольку приходится обрабатывать длинные строки (например, «Backspace») для тех нажатий клавиш, которые не приводят к вводу текста.
Наиболее подходящим вариантом является обработка события PreviewTextlnput (где выполняется большая часть проверки) в сочетании с событием PreviewKeyDown для нажатий тех клавиш, которые не генерируют событие PreviewTextInput в текстовом поле (например, пробела).
keydown и keyup
События происходят при нажатии клавиш клавиатуры. Но в чем между ними разница?
Время чтения: меньше 5 мин
Открыть/закрыть навигацию по статье
Контрибьюторы:
- Николай Лопин ,
- Светлана Коробцева ,
- Виталий Баев
Обновлено 1 августа 2022
Эта статья связана с обработкой событий в JavaScript. Зачем нужны события и как с ними работать читайте в статье События.
Кратко
События на HTML-элементе. Когда пользователь нажимает на клавишу клавиатуры, происходит событие keydown , как только пользователь отпустил клавишу — произойдёт событие keyup .
Событие keydown фиксирует момент нажатия клавиши, до того как эта клавиша будет отпущена, что, по сути, является первой фазой нажатия. Продолжением является событие keyup — момент, когда клавиша будет отпущена.
Как пишется
keydown
const spy = document.getElementById('keyboardSpy') spy.addEventListener('keydown', function (event) alert('Нажата клавиша ' + event.key)>)const spy = document.getElementById('keyboardSpy') spy.addEventListener('keydown', function (event) alert('Нажата клавиша ' + event.key) >)
keyup
const spy = document.getElementById('keyboardSpy') spy.addEventListener('keyup', function (event) alert(`Клавиша $ отпущена`)>)const spy = document.getElementById('keyboardSpy') spy.addEventListener('keyup', function (event) alert(`Клавиша $event.key> отпущена`) >)
Как понять
В функцию-обработчик также передаётся объект события, в котором есть информация о нажатой кнопке:
- key — символьное значение. s , Я , U и так далее.
- code — название клавиши. KeyS , KeyZ , KeyU и так далее.
- altKey — true или false , была ли одновременно нажата/отпущена клавиша Alt .
- ctrlKey — true или false , была ли одновременно нажата/отпущена клавиша Ctrl .
- shiftKey — true или false , была ли одновременно нажата/отпущена клавиша Shift .
- metaKey — true или false , была ли одновременно нажата/отпущена так называемая мета-клавиша (на Mac клавиатурах это ⌘ Command , а в Windows клавиатурах — Windows key ⊞ ).
keyCode— код нажатой клавиши. 83 , 90 , 85 и так далее.
️Свойство keyCode является устаревшим! Избегайте его использования, поскольку его поддержка может быть прекращена браузерами в будущем.
key возвращает символьное представление клавиши. Другими словами, если эта клавиша печатает какой-то символ, то key будет содержать его. В случае, если нажата управляющая клавиша (Shift, Ctrl и т.д.), key вернёт название этой клавиши.
code же возвращает название клавиши в контексте её физического положения на клавиатуре. Например, если взять стандартную русско-английскую QWERTY клавиатуру и нажать в русской раскладке q / й , key будет q , а code — KeyQ . Если переключить раскладку на английский и нажать ту же клавишу, то key поменяется на й , а вот code так и останется KeyQ . Также code даёт больше информации положении парных клавиш. Если нажать левый Shift, то key будет содержать просто Shift , зато code вернёт — ShiftLeft .
Благодаря этим свойствам, code удобно использовать, например для управления клавиатурой в играх, когда есть необходимость задать определённым клавишам нужные действия независимо от языка раскладки.
Если подытожить, то key говорит нам, какой символ будет напечатан, а code — название этой клавиши на клавиатуре независимо от текущего языка ввода.
Пример Keydown
При нажатии на любую клавишу в демо ниже, будет срабатывать событие keydown , которое будет выводить подсказку о нажатых клавишах:
Пример Keyup
Следующее демо будет сохранять цвет до тех пор, пока не будет зафиксировано событие keyup на клавише Shift .
Событие keydown выполняется бесконечное множество раз, до тех пор, пока клавиша будет зажата. Событие keyup будет выполнено только один раз — в момент, когда пользователь отпустит клавишу
На практике
Алекс Стегура
События помогут добавить горячие клавиши на сайт. Например, открывать меню по комбинации клавиш или скрывать окна по кнопке Esc .
Существует похожее событие keypress , оно устаревшее. Вместо него нужно использовать keydown .
События клавиатуры
Объекты KeyboardEvent описывают работу пользователя с клавиатурой. Каждое событие описывает клавишу; тип события (keydown, keypress или keyup) определяет произведённый тип действия.
Примечание: KeyboardEvent сообщит только о том, что на клавише произошло событие. Когда вам нужно обрабатывать ввод текста, то вместо него используйте «HTML5 input»-событие. Например, если пользователь вводит текст рукописным способом, предположим с планшета, то события клавиш могут не возникать.
keydown Событие происходит, когда нажата клавиша на клавиатуре над элементом, но ещё не отпущена. keypress Событие происходит, когда пользователь нажал клавишу на клавиатуре над элементом. keyup Событие происходит, когда нажатая клавиша на клавиатуре над элементом перешла в состояние отпущено.
Свойства объекта KeyboardEvent
| altKey | Возвращает true , если нажата клавиша ALT. |
| ctrlKey | Возвращает true , если нажата клавиша CTRL. |
| shiftKey | Возвращает true , если нажата клавиша SHIFT. |
| metaKey | Возвращает true , если нажата клавиша META. |
| charCode | Содержит код Юникода сгенерированного печатного символа для события keypress . |
| code | Определяет физическое расположение нажатой клавиши на клавиатуре |
| key | Возвращает строку, представлающее значение клавиши, на которой возникло событие. |
| keyCode | Возвращает виртуальный код нажатой клавиши. |
| locale | Определяет язык для событий клавиатуры и событий textinput. |
| location | Определяет местоположение нажатой клавиши для событий клавиатуры. |
| which | Возвращает виртуальный код нажатой клавиши. |
События keydown и keyup
События keydown/keyup происходят при нажатии/отпускании клавиши и позволяют получить её скан-код в свойстве keyCode .
Скан-код клавиши одинаков в любой раскладке и в любом регистре. Например, клавиша z может означать символ «z» , «Z» или «я» , «Я» в русской раскладке, но её скан-код будет всегда одинаков: 90 .
Скан-коды
Для буквенно-цифровых клавиш есть очень простое правило: скан-код будет равен коду соответствующей заглавной английской буквы/цифры.
Например, при нажатии клавиши S (не важно, каков регистр и раскладка) её скан-код будет равен «S».charCodeAt(0) .
Для других символов, в частности, знаков пунктуации, есть таблица кодов, которую можно взять, например, из статьи Джона Уолтера: JavaScript Madness: Keyboard Events, или же можно нажать на нужную клавишу на тестовом стенде и получить код.
Когда-то в этих кодах была масса кросс-браузерных несовместимостей. Сейчас всё проще – таблицы кодов в различных браузерах почти полностью совпадают. Но некоторые несовместимости, всё же, остались. Вы можете увидеть их в таблице ниже. Слева – клавиша с символом, а справа – скан-коды в различных браузерах.
| Клавиша | Firefox | Остальные браузеры |
|---|---|---|
| ; | 59 | 186 |
| = | 107 | 187 |
| — | 109 | 188 |
Остальные коды одинаковы, код для нужного символа будет в тестовом стенде.
Тестовый стенд
#kinput < font-size: 150%; box-sizing: border-box; width: 95%; >#area
Событие keypress
Событие keypress возникает сразу после keydown , если нажата символьная клавиша, т.е. нажатие приводит к появлению символа.
Любые буквы, цифры генерируют keypress. Управляющие клавиши, такие как Ctrl , Shift , F1 , F2 … – keypress не генерируют.
Событие keypress позволяет получить код символа. В отличие от скан-кода, он специфичен именно для символа и различен для «z» и «я» .
Код символа хранится в свойствах: charCode и which . Здесь скрывается целое «гнездо» кросс-браузерных несовместимостей, разбираться с которыми нет никакого смысла – запомнить сложно, а на практике нужна лишь одна «правильная» функция, позволяющая получить код везде.
Получение символа в keypress
Кросс-браузерная функция для получения символа из события keypress:
// event.type должен быть keypress function getChar(event) < if (event.which == null) < // IE if (event.keyCode < 32) return null; // спец. символ return String.fromCharCode(event.keyCode) >if (event.which != 0 && event.charCode != 0) < // все кроме IE if (event.which < 32) return null; // спец. символ return String.fromCharCode(event.which); // остальные >return null; // спец. символ >
Для общей информации – вот основные браузерные особенности, учтённые в getChar(event) :
- Во всех браузерах, кроме IE, у события keypress есть свойство charCode , которое содержит код символа.
- Браузер IE для keypress не устанавливает charCode , а вместо этого он записывает код символа в keyCode (в keydown/keyup там хранится скан-код).
- Также в функции выше используется проверка if(event.which!=0) , а не более короткая if(event.which) . Это не случайно! При event.which=null первое сравнение даст true , а второе – false .
Модификаторы shift, alt, ctrl и meta
Во всех событиях объекты KeyboardEven t присутствует информация о нажатых клавишах-модификаторах.
Синтаксис
event.altKey event.ctrlKey event.metaKey // для Mac event.shiftKey
Возвращаемое значение
Свойство возвращает true , если нажата соответствующая клавиша, и false — в противном случае
Комментарии
Чтобы пользователи операционных систем работали с комфортом, в паре с ctrlKey нужно обязательно использовать metaKey .
В JS-коде это означает, что для удобства пользователей Mac нужно проверять
if (event.ctrlKey || event.metaKey)
charCode
Свойство charCode содержит код Юникода сгенерированного печатного символа для события keypress
Синтаксис
event.charCode
Возвращаемое значение
- Число — код символа в Юникоде для событий keypress
- 0 — для событий keydown и keyup .
Комментарии
Свойство не используется событиями «keydown» и «keyup».
Преобразовать код символа в Юникоде в строку можно с помощью метода String.fromCharCode().
Для событий keypress то же самое значение большинство броузеров записывают в свойство keyCode. Однако в Firefox свойство keyCode не определено для события keypress , поэтому следует использовать свойство charCode .
Данное свойство является нестандартным, отсутствует в модели событий IE8- и не имитируется в модели событий jQuery.
Для кроссбраузерного решения можно использовать следующий код:
var x = event.charCode || event.keyCode;
code
Свойство key возвращает строку, представлающее физическое расположение нажатой клавиши на клавиатуре.
Синтаксис
event.code
Комментарии
Свойство code представляет значение, которое не зависит ни от раскладки клавиатуры, ни от нажатия клавиш-модификаторов. Нажатию одной клавиши может соответствовать несколько различных символов, поэтому полученное значение не получится использовать для представления в виде текста.
Совместимость с браузерами
![]() |
![]() |
![]() |
![]() |
![]() |
| 48,0 | Нет | 32,0 | 10,1 | Да |
key
Свойство key возвращает строку, представлающее значение клавиши, на которой возникло событие.
Синтаксис
event.key
Возвращаемое значение
Для событий клавиатуры, генерирующих символы, это свойство получает значение нажатой клавиши (такое как «a» , «W» , «4» , «+», «$», . ).
Для событий клавиатуры, не генерирующих символы, это свойство содержит имя нажатой клавиши (такое как, «Tab», «Down», . ).
Совместимость с браузерами
![]() |
![]() |
![]() |
![]() |
![]() |
| 51,0 | 9,0 | 23,0 | Да | 38 |
keyCode
Свойство keyCode возвращает виртуальный код нажатой клавиши.
Синтаксис
event.keyCode
Возвращаемое значение
- Число — код символа в Юникоде для событий keypress
- Скан-код — для событий keydown и keyup .
Комментарии
В Firefox, свойство keyCode не работает на событие keypress (возаращает 0). Для кроссбраузерного решения можно использовать следующий код:
var x = event.charCode || event.keyCode;
Свойство keyCode не было стандартизовано, но определяется всеми броузерами, включая IE.
locale
Свойство locale определяет язык для событий клавиатуры и событий textinput.
Синтаксис
event.locale
Возвращаемое значение
Код языка (например, «en-GB»), идентифицирующий выбранную раскладку клавиатуры,если эта информация доступна.
Комментарии
Свойство locale поддерживается не всеми браузерами,
location
Свойство location определяет местоположение нажатой клавиши для событий клавиатуры.
Синтаксис
event.location
Возвращаемое значение
Возвращает число (константу), представляющее расположение клавиши на клавиатуре или другом устройстве ввода: 0. DOM_KEY_LOCATION_STANDARD Кнопка не нажата на правой или левой стороне клавиатуры, а также не была нажата на цифровой клавиатуре (это значение представляет почти все клавиши на клавиатуре, например , «A» , «U» , «SPACE» или «5» ) 1. DOM_KEY_LOCATION_LEFT Левая клавиша была нажата (например , левый «CTRL» или «ALT») 2. DOM_KEY_LOCATION_RIGHT Правая клавиша была нажата (например, правый «CTRL») 3. DOM_KEY_LOCATION_NUMPAD Клавиша была нажата на цифровой клавиатуре (например, «2» клавишу на правой стороне на стандартной клавиатуре) 4. DOM_KEY_LOCATION_MOBILE Клавиша была нажата на мобильном устройстве; это может быть либо физическая клавиатура, либо виртуальная клавиатура. 5. DOM_KEY_LOCATION_JOYSTICK Клавиша была нажата на игровом контроллере или джойстике на мобильном устройстве.
Совместимость с браузерами
![]() |
![]() |
![]() |
![]() |
![]() |
| Да | 9,0 | 15,0 | 6,1 | Да |
which
Свойство which возвращает виртуальный код нажатой клавиши.
Синтаксис
event.which
Возвращаемое значение
- Число — код символа в Юникоде для событий keypress
- Скан-код — для событий keydown и keyup .
Комментарии
Свойство which в IE8-. Для этих версий браузера можно использовать свойство keyCode. Однако свойство keyCode не работает для события keypress в Firefox. Для кроссбраузерного решения можно использовать следующий код:
var x = event.which || event.keyCode;
Свойство which не стандартизовано и поэтому НЕ РЕКОМЕНДУЕТСЯ использовать.
Совместимость с браузерами
![]() |
![]() |
![]() |
![]() |
![]() |
| Да | 9,0 | 15,0 | 5,1 | 10,10 |
Какое событие возникает при нажатии и отпускании любой клавиши
На этом шаге мы начнем рассматривать события, связанные с клавиатурой.
В оконных компонентах Delphi определены три события, связанные с клавиатурой. Это события (таблица 1):
| Событие | Описание |
|---|---|
| OnKeyDown | Событие наступает при нажатии пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ нажатой клавиши. |
| OnKeyPress | Событие наступает при нажатии пользователем клавиши символа. Можно распознать только нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши и кнопки. |
| OnKeyUp | Событие наступает при отпускании пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, и кнопки мыши, но нельзя распознать символ отпускаемой клавиши. |
Кроме того, при нажатии пользователем клавиши табуляции фокус может переключаться с элемента на элемент, что вызывает события OnEnter и OnExit .
Важно четко представлять последовательность событий, происходящих при нажатии пользователем клавиши или комбинации клавиш. Пусть, например, пользователь нажал клавишу Shift (перевел ввод в верхний регистр), а затем нажал клавишу символа ‘н’. Последовательность событий для этого случая приведена таблице 2. В таблице указано, что именно можно распознать при каждом нажатии. Отметим, что различить символ в верхнем и нижнем регистрах и различить латинский символ и символ кириллицы можно только в обработчике события OnKeyPress . Действительно, хотя в событии OnKeyDown при нажатии клавиши ‘н’ можно определить, что при этом одновременно нажата и клавиша Shift , этого еще мало, чтобы утверждать, что символ относится к верхнему регистру. Ведь если перед этим была включена клавиш CapsLock , то при нажатой клавише Shift символ окажется в нижнем регистре. А информация о том, включена или выключена клавиша CapsLock , в обработчик события OnKeyDown не передается.
| Действие пользователя | Событие |
|---|---|
| Нажатие клавиши Shift . | OnKeyDown . Возможно распознавание нажатой клавиши Shift . |
| Нажатие клавиши «н». | OnKeyDown . Возможно распознавание нажатой клавиши Shift , нажатой клавиши «н», но отличить верхний регистр от нижнего и латинский символ от русского невозможно. |
| OnKeyPress . Возможно распознавание символа с учетом регистра и языка, но невозможно распознавание нажатой клавиши Shift . | |
| Отпускание клавиши «н». | OnKeyUp . Возможно распознавание нажатой клавиши Shift , отпущенной клавиши «н», но отличить верхний регистр от нижнего и латинский символ от русского невозможно. |
| Отпускание клавиши Shift . | OnKeyUp . Возможно распознавание отпущеной клавиши Shift . |
Следует отметить, что событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift . Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событие OnKeyPress может не наступить (произойдут только события OnKeyDown при нажатии и OnKeyUp при отпускании) или, если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событие OnKeyPress при нажатии символьной клавиши не наступает. А при нажатой клавише Ctrl событие OnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.
В заключение надо остановиться на вопросе, куда поступают события клавиатуры. У формы имеется свойство KeyPreview . Оно влияет на обработку событий, поступающих от клавиатуры (в число этих событий не входит нажатие клавиш со стрелками, клавиш табуляции и т.п.). По умолчанию свойство KeyPreview paвно false и события клавиатуры поступают на обработчики, предусмотренные в активном в данный момент компоненте. Но если задать значение KeyPreview равным trueе , то сначала эти события будут поступать на обработчики формы, если таковые предусмотрены, и только потом поступят на обработчики активного компонента.
Замечание. Имеется также событие OnShortCut приложения ( Application ), которое возникает при нажатии пользователем клавиши. Событие возникает до того, как возникло стандартное событие OnKeyDown компонента или формы. Это событие, как и все события приложения, перехватывает введенный в Delphi 5 компонент АрplicationEvents . Обработчик этого события позволяет предусмотреть нестандартную реакцию на нажатие какой-то клавиши. В него передается параметр сообщения Windows Msg , поле CharCode которого ( Msg.CharCode ) содержит виртуальный код нажатой клавиши. Передается также по ссылке параметр Handled . Если задать ему значение true , то стандартные события OnKeyDown, OnKeyPress, OnKeyUp не наступят.
Пусть, например, нужно, чтобы при нажатии пользователем клавиши «Q» приложение закрывалось, спросив предварительно пользователя, действительно ли он хочет закончить работу. Тогда обработчик события OnShortCut компонента ApplicationEvents может иметь вид:
Если пользователь нажал клавишу с символом «Q» (в любом регистре и независимо от установки русского или английского языка), то пользователю методом Application.MessageBox предлагается диалоговое окно с запросом о завершении работы. Если пользователь в нем нажмет кнопку Да , то приложение закрывается методом Application.Terminate .
На следующем шаге мы продолжим рассматривать события, связанные с клавиатурой.




