Отображение кодов нажимаемых клавиш


Содержание

JavaScript коды символов (коды клавиш)

Очень часто клиентский JavaScript используется для выполнения простых задач, которые в противном случае потребовалось бы обрабатывать на серверной стороне. Многие из этих простых задач включают обработку текста или символов, введенных в элемент form на веб-странице, для чего бывает необходимо знать код JavaScript, связанный с этим символом.

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

Клавиатура: keydown и keyup

Прежде чем перейти к клавиатуре, обратите внимание, что на современных устройствах есть и другие способы «ввести что-то». Например, распознавание речи (это особенно актуально на мобильных устройствах) или Копировать/Вставить с помощью мыши.

Поэтому, если мы хотим корректно отслеживать ввод в поле , то одних клавиатурных событий недостаточно. Существует специальное событие input , чтобы отслеживать любые изменения в поле . И оно справляется с такой задачей намного лучше. Мы рассмотрим его позже в главе События: change, input, cut, copy, paste.

События клавиатуры же должны использоваться, если мы хотим обрабатывать взаимодействие пользователя именно с клавиатурой (в том числе виртуальной). К примеру, если нам нужно реагировать на стрелочные клавиши Up и Down или горячие клавиши (включая комбинации клавиш).

Тестовый стенд

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

Сфокусируйтесь на поле и нажмите какую-нибудь клавишу.

События keydown и keyup

Событие keydown происходит при нажатии клавиши, а keyup – при отпускании.

event.code и event.key

Свойство key объекта события позволяет получить символ, а свойство code – «физический код клавиши».

К примеру, одну и ту же клавишу Z можно нажать с клавишей Shift и без неё. В результе получится два разных символа: z в нижнем регистре и Z в верхнем регистре.

Свойство event.key – это непосредственно символ, и он может различаться. Но event.code всегда будет тот же:

Клавиша event.key event.code
Z z (нижний регистр) KeyZ
Shift + Z Z (Верхний регистр) KeyZ

Если пользователь работает с разными языками, то при переключении на другой язык символ изменится с «Z» на совершенно другой. Получившееся станет новым значением event.key , тогда как event.code останется тем же: «KeyZ» .

У каждой клавиши есть код, который зависит от её расположения на клавиатуре. Подробно о клавишных кодах можно прочитать в спецификации о кодах событий UI.

  • Буквенные клавиши имеют коды по типу «Key » : «KeyA» , «KeyB» и т.д.
  • Коды числовых клавиш строятся по принципу: «Digit » : «Digit0» , «Digit1» и т.д.
  • Код специальных клавиш – это их имя: «Enter» , «Backspace» , «Tab» и т.д.

Существует несколько широко распространённых раскладок клавиатуры, и в спецификации приведены клавишные коды к каждой из них.

Можно их прочитать в разделе спецификации, посвящённом буквенно-цифровым клавишам или просто нажмите нужную клавишу на тестовом стенде выше и посмотрите.

Выглядит очевидно, но многие всё равно ошибаются.

Пожалуйста, избегайте опечаток: правильно KeyZ , а не keyZ . Условие event.code==»keyZ» работать не будет: первая буква в слове «Key» должна быть заглавная.

А что, если клавиша не буквенно-цифровая? Например, Shift или F1 , или какая-либо другая специальная клавиша? В таких случаях значение свойства event.key примерно тоже, что и у event.code :

Клавиша event.key event.code
F1 F1 F1
Backspace Backspace Backspace
Shift Shift ShiftRight или ShiftLeft

Обратите внимание, что event.code точно указывает, какая именно клавиша нажата. Так, большинство клавиатур имеют по две клавиши Shift : слева и справа. event.code уточняет, какая именно из них была нажата, в то время как event.key сообщает о «смысле» клавиши: что вообще было нажато ( Shift ).

Допустим, мы хотим обработать горячую клавишу Ctrl + Z (или Cmd + Z для Mac). Большинство текстовых редакторов к этой комбинации подключают действие «Отменить». Мы можем поставить обработчик событий на keydown и проверять, какая клавиша была нажата.

Здесь возникает дилемма: в нашем обработчике стоит проверять значение event.key или event.code ?

С одной стороны, значение event.key – это символ, он изменяется в зависимости от языка, и если у пользователя установлено в ОС несколько языков, и он переключается между ними, нажатие на одну и ту же клавишу будет давать разные символы. Так что имеет смысл проверять event.code , ведь его значение всегда одно и тоже.

Вот пример кода:

С другой стороны, с event.code тоже есть проблемы. На разных раскладках к одной и той же клавише могут быть привязаны разные символы.

Например, вот схема стандартной (US) раскладки («QWERTY») и под ней немецкой («QWERTZ») раскладки (из Википедии):

Для одной и той же клавиши в американской раскладке значение event.code равно «Z», в то время как в немецкой «Y».

Буквально, для пользователей с немецкой раскладкой event.code при нажатии на Y будет равен KeyZ .

Если мы будем проверять в нашем коде event.code == ‘KeyZ’ , то для людей с немецкой раскладкой такая проверка сработает, когда они нажимают Y .

Звучит очень странно, но это и в самом деле так. В спецификации прямо упоминается такое поведение.

Так что event.code может содержать неправильный символ при неожиданной раскладке. Одни и те же буквы на разных раскладках могут сопоставляться с разными физическими клавишами, что приводит к разным кодам. К счастью, это происходит не со всеми кодами, а с несколькими, например KeyA , KeyQ , KeyZ (как мы уже видели), и не происходит со специальными клавишами, такими как Shift . Вы можете найти полный список проблемных кодов в спецификации.

Чтобы отслеживать символы, зависящие от раскладки, event.key надёжнее.


С другой стороны, преимущество event.code заключается в том, что его значение всегда остаётся неизменным, будучи привязанным к физическому местоположению клавиши, даже если пользователь меняет язык. Так что горячие клавиши, использующие это свойство, будут работать даже в случае переключения языка.

Хотим поддерживать клавиши, меняющиеся при раскладке? Тогда event.key – верный выбор.

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

Автоповтор

При долгом нажатии клавиши возникает автоповтор: keydown срабатывает снова и снова, и когда клавишу отпускают, то отрабатывает keyup . Так что ситуация, когда много keydown и один keyup , абсолютно нормальна.

Для событий, вызванных автоповтором, у объекта события свойство event.repeat равно true .

Действия по умолчанию

Действия по умолчанию весьма разнообразны, много чего можно инициировать нажатием на клавиатуре.

  • Появление символа (самое очевидное).
  • Удаление символа (клавиша Delete ).
  • Прокрутка страницы (клавиша PageDown ).
  • Открытие диалогового окна браузера «Сохранить» ( Ctrl + S )
  • …и так далее.

Предотвращение стандартного действия с помощью event.preventDefault() работает практически во всех сценариях, кроме тех, которые происходят на уровне операционной системы. Например, комбинация Alt + F4 инициирует закрытие браузера в Windows, что бы мы ни делали в JavaScript.

Для примера, ниже ожидает телефонный номер, так что ничего кроме чисел, + , () или — принято не будет:

Заметьте, что специальные клавиши, такие как Backspace , Left , Right , Ctrl + V , в этом поле для ввода не работают. Это побочный эффект чересчур жёсткого фильтра checkPhoneKey .

Добавим ему немного больше свободы:

Теперь стрелочки и удаление прекрасно работают.

…Впрочем, мы всё равно можем ввести в что угодно с помощью правого клика мыши и пункта «Вставить» контекстного меню. Так что такой фильтр не обладает 100% надёжностью. Мы можем просто оставить всё как есть, потому что в большинстве случаев это работает. Альтернатива – отслеживать событие input , оно генерируется после любых изменений в поле , и мы можем проверять новое значение и подчёркивать/изменять его, если оно не подходит.

«Дела минувших дней»

В прошлом существовало также событие keypress , а также свойства keyCode , charCode , which у объекта события.

Но количество браузерных несовместимостей при работе с ними было столь велико, что у разработчиков спецификации не было другого выхода, кроме как объявить их устаревшими и создать новые, современные события (которые и описываются в этой главе). Старый код ещё работает, так как браузеры продолжают поддерживать и keypress , и keyCode с charCode , и which , но более нет никакой необходимости в их использовании.

Итого

Нажатие клавиши всегда генерирует клавиатурное событие, будь то буквенно-цифровая клавиша или специальная типа Shift или Ctrl и т.д. Единственным исключением является клавиша Fn , которая присутствует на клавиатуре некоторых ноутбуков. События на клавиатуре для неё нет, потому что она обычно работает на уровне более низком, чем даже ОС.

  • keydown – при нажатии на клавишу (если клавиша остаётся нажатой, происходит автоповтор),
  • keyup – при отпускании клавиши.

Главные свойства для работы с клавиатурными событиями:

  • code – «код клавиши» ( «KeyA» , «ArrowLeft» и так далее), особый код, привязанный к физическому расположению клавиши на клавиатуре.
  • key – символ ( «A» , «a» и так далее), для не буквенно-цифровых групп клавиш (таких как Esc ) обычно имеет то же значение, что и code .

В прошлом события клавиатуры иногда использовались для отслеживания ввода данных пользователем в полях формы. Это ненадёжно, потому как ввод данных не обязательно может осуществляться с помощью клавиатуры. Существуют события input и change специально для обработки ввода (рассмотренные позже в главе События: change, input, cut, copy, paste). Они срабатывают в результате любого ввода, включая Копировать/Вставить мышью и распознавание речи.

События клавиатуры же должны использоваться только по назначению – для клавиатуры. Например, чтобы реагировать на горячие или специальные клавиши.

Задачи

Отследить одновременное нажатие

Создайте функцию runOnKeys(func, code1, code2, . code_n) , которая запускает func при одновременном нажатии клавиш с кодами code1 , code2 , …, code_n .

Например, код ниже выведет alert при одновременном нажатии клавиш «Q» и «W» (в любом регистре, в любой раскладке)

Необходимо использовать два обработчика событий: document.onkeydown и document.onkeyup .

Создадим множество pressed = new Set() , в которое будем записывать клавиши, нажатые в данный момент.

В первом обработчике будем добавлять в него значения, а во втором удалять. Каждый раз, как отрабатывает keydown , будем проверять – все ли нужные клавиши нажаты, и, если да – выводить сообщение.

JavaScript: Информация О Нажатой Клавише ����

В данной статье рассмотрим, как получить информацию о нажатой клавише клавиатуры или кнопки мыши, а также как выполнять необходимые действия (нужный код) при нажатии определенных сочетаний клавиш или кнопок (правый/левый клик мыши).

Чтобы получить информацию, о том какая кнопка клавиатуры нажимается в данный момент, воспользуемся следующим кодом:

Номер кнопки находится в переменной keyNum


Узнать keyCode кнопки можете здесь:

Выполнение кода в зависимости от нажатой клавиши

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

Для этой задачи воспользуемся оператором switch

В конструкции case укажите номер кнопки, для которой будет выполнен необходимый код.

Вместо console.log выполняйте необходимые действия.

Если была нажата клавиша, которой нет в списке, то для неё можете выполнить другой код. Писать в default

Как отследить комбинации нажатых клавиш

Отследить нажатие CTRL, SHIFT и ALT можно также другими способами (данный способ необходим чтобы отследить комбинации)

Например, отследить нажатие CTRL можно следующим образом:

Используя всю ранее полученную информацию, определим нажатую комбинацию клавиш, например, CTRL + F5

Как вы могли заметить, обращаться к клавишам в JavaScript можно несколькими способами. Например, следующие строки кода позволяют нам получить один и тот же результат:

Мы рассмотрели, как получить информацию о нажатой клавише на клавиатуре. Теперь давайте рассмотрим, как обработать события мыши.

Информация о нажатой кнопке мыши JavaScript

Рассмотрим, как определить какая кнопка мыши нажимается над объектом: левая нопка, правая или дабл клик

Выполнение кода при клике левой кнопкой мыши

Выполнение кода при клике правой кнопкой мыши

Выполнение кода при двойном клике по кнопке

Полный список комбинаций клавиш на клавиатуре

Часто читая статьи в интернете или инструкцию по установке какой-либо программы, Вы можете встретить комбинации клавиш (Ctrl-C, Ctrl-V, Win-R, Alt-Tab, Alt-F4 и т.д.). И если Вы, до сих пор не знаете, что они значат, тогда Вы можете ознакомиться с ними в нашей статьёй.

В данной статье представлен, полный список комбинаций клавиш на клавиатуре, используемые не только в операционной системе Windows.

Разделы по работе с комбинациями клавиш:

  1. Основные комбинации клавиш на клавиатуре
  2. Горячие клавиши общего назначения
  3. Комбинации клавиш предназначенные для работы с текстом
  4. Комбинации клавиш для работы с файлами
  5. Комбинации клавиш для работы в проводнике
  6. Комбинации клавиш для работы с окнами
  7. Комбинации клавиш для работы с диалоговыми окнами
  8. Комбинации клавиш для работы в браузерах (Internet Explorer, Google Chrome, Mozilla)
  9. Специальные возможности

Основные комбинации клавиш на клавиатуре

Alt+Tab — Переключение между окнами
Win+Tab — Переключение между окнами в режиме Flip 3D
Win+Up — Развернуть окноWin+Down — Восстановить / Минимизировать окно
Win+Left — Прикрепить окно к левому краю экрана
Win+Right — Прикрепить окно к правому краю экрана
Win+Shift+Left — Переключиться на левый монитор
Win+Shift+Right — Переключиться на правый монитор
Win+Home — Минимизировать / Восстановить все неактивные окна
Win+Break(или Pause) — Запустить элемент Система из Панели Управления (пункт Свойства при нажатии правой кнопкой мыши на Компьютер в меню Пуск)
Win+Space — Показать рабочий стол
Win+B — Переход в область уведомлений(трей)
Win+D — Свернуть окна или восстановить все окна
Win+E — Запустить Проводник(Explorer)
Win+F — Запустить встроенный диалог поиска Windows
Win+Ctrl+F — Запустить Поиск по компьютеру из домена
Win+F1 — Запустить встроенный диалог Windows: Справка и Поддержка
Win+G — Отобразить гаджеты поверх всех окон
Win+L — Блокировка рабочей станции(текущего сеанса пользователя)
Win+M — Минимизировать все окна
Win+P — Отобразить дополнительные опции дисплея (расширить рабочий стол на 2 монитор и т.п.)
Win+R — Запустить диалоговое окно Выполнить
Win+Т — Выбрать первый элемент в панели задач (Повторное нажатие переключает на следующий элемент, Win+Shift+T — прокручивает в обратном порядке)
Win+U — Запустить Центр специальных возможностей (Ease of Access Center)
Win+X — Запустить Mobility Center
Win+цифра— Запустить приложение с панели задач (Win+1 запускает первое приложения слева, Win+2, второе, и т.к.)
Win + «+» — Увеличить масштаб
Win + «-« — Уменьшить масштаб
Ctrl + колесо мыши (вверх\вниз) на рабочем столе — увеличить\уменьшить иконки рабочего стола.

В Проводнике (Explorer):
Alt+P — Показать / Скрыть Область предпросмотра

Панель задач:
Shift + щелчок на иконке — Открыть новое окно приложения
Ctrl + Shift + щелчок по иконке — Открыть новое окно приложения с привилегиями администратора
Shift + щелчок правой кнопкой на иконке — Показать меню приложения
Shift + щелчок правой кнопкой на группе иконок — Показать меню, восстановить все / cвернуть все / Закрыть все
Ctrl + щелчок по группе икнонок — Развернуть все окна группы

Примечание
Клавиша Win находится между клавишами Ctrl и Alt с левой стороны (на ней нарисована эмблема Windows).
Клавиша Menu находится слева от правого Ctrl.
Комбинация «клавиша» + «клавиша» означает, что сначала надо нажать первую клавишу, а затем, удерживая ее, вторую.

Коды клавиш клавиатуры


Таблица кодов клавиш, которыми можно пользоваться при проверке параметра Key в обработчиках событий OnKeyDown и OnKeyUp :

Клавиша

Дес.
число

Шест.
число

Символическое
имя

Сравнение по
функции ord

F1 112 $70 VK_F1 F2 113 $71 VK_F2 F3 114 $72 VK_F3 F4 115 $73 VK_F4 F5 116 $74 VK_F5 F6 117 $75 VK_F6 F7 118 $76 VK_F7 F8 119 $77 VK_F8 F9 120 $78 VK_F9 F10 121 $79 VK_F10 пробел 32 $20 VK_SPACE BackSpace 8 $8 VK_BACK Tab 9 $9 VK_TAB Enter 13 $0D VK_RETURN Shift 16 $10 VK_SHIFT Ctrl 17 $11 VK_CONTROL Alt 18 $12 VK_MENU CapsLock 20 $14 VK_CAPITAL Esc 27 $1B VK_ESCAPE Insert 45 $2D VK_INSERT PageUp 33 $21 VK_PRIOR PageDown 34 $22 VK_NEXT End 35 $23 VK_END Home 36 $24 VK_HOME Стрелка назад 37 $25 VK_LEFT Стрелка вверх 38 $26 VK_UP Стрелка вперед 39 $27 VK_RIGHT Стрелка вниз 40 $28 VK_DOWN Delete 46 $2E VK_DELETE PrintScreen 44 $2C VK_SNAPSHOT ScrollLock 145 $91 VK_SCROLL Pause 19 $13 VK_PAUSE NumLock 144 $90 VK_NUMLOCK 0,) 48 $30 Ord(‘0’) 1! 49 $31 Ord(‘1’) 2@ 50 $32 Ord(‘2’) 3# 51 $33 Ord(‘3’) 4$ 52 $34 Ord(‘4’) 5% 53 $35 Ord(‘5’) 6^ 54 $36 Ord(‘6’) 7& 55 $37 Ord(‘7’) 8* 56 $38 Ord(‘8’) 9( 57 $39 Ord(‘9’) `

192 $C0 -_ 189 $BD =+ 187 $BB [ < 219 $DB ]> 221 $DD :; 186 $BA ‘” 222 $DE | 220 $DC , 190 $BE /? 191 $BF A a 65 $41 Ord(‘A’) B b 66 $42 Ord(‘B’) С с 67 $43 Ord(‘С’) D d 68 $44 Ord(‘D’) E e 69 $45 Ord(‘E’) F f 70 $46 Ord(‘F’) G g 71 $47 Ord(‘G’) H h 72 $48 Ord(‘H’) I i 73 $49 Ord(‘I’) J j 74 $4A Ord(‘J’) K k 75 $4B Ord(‘K’) L l 76 $4C Ord(‘L’) M m 77 $4D Ord(‘M’) N n 78 $4E Ord(‘N’) O o 79 $4F Ord(‘O’) P p 80 $50 Ord(‘P’) Q q 81 $51 Ord(‘Q’) R r 82 $52 Ord(‘R’) S s 83 $53 Ord(‘S’) T t 84 $54 Ord(‘T’) U u 85 $55 Ord(‘U’) V v 86 $56 Ord(‘V’) W w 87 $57 Ord(‘W’) X x 88 $58 Ord(‘X’) Y y 89 $59 Ord(‘Y’) Z z 90 $5A Ord(‘Z’)

Правая клавиатура при выключенной клавише NumLock:

Клавиша

Дес.
число

Шест.
число

Символическое
имя

Win32 API. Работа с клавиатурой

Written on 15 Февраля 2007 . Posted in Win32

ОГЛАВЛЕНИЕ

О вводе информации с клавиатуры

Все прикладные программы, написанные для Microsoft Windows должны принимать вводимую пользователем информацию с клавиатуры также как и от мыши. Базирующаяся на Windows программа, принимает ввод информации с клавиатуры в форме сообщений, посылаемых в ее окна.

Модель ввода информации с клавиатуры

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

Присвоенное для каждой клавиши на клавиатуре уникальное значение, называемое скэн-кодом (scan code), аппаратно-зависимый идентификатор для клавиши на клавиатуре. Клавиатура генерирует два скэн-кода, когда пользователь манипулирует клавишей — первый, когда пользователь нажимает клавишу, а второй, когда пользователь отпускает клавишу.

Драйвер устройства клавиатуры интерпретирует скэн-код и переводит его в код виртуальной клавиши (virtual-key code), в не зависящее от устройства значение, определяемое Windows, которое идентифицирует целевую клавишу. После трансляции скэн-кода, раскладка символов на клавиатуре создает сообщение, которое включает в себя скэн-код, код виртуальной клавиши и другую информацию о нажатии клавиши, а затем помещает сообщение в системную очередь сообщений. Windows удаляет сообщение из системной очереди сообщений и посылает его в очередь сообщений соответствующего потока. В конечном счете, цикл сообщения потока удаляет сообщение и посылает его соответствующей оконной процедуре для обработки.

Фокус и активизация клавиатуры

Windows посылает сообщения клавиатуры в очередь сообщений активного потока, который создал окно с фокусом клавиатуры. Фокус клавиатуры (keyboard focus) — временное свойство окна. Windows дает возможность совместно использовать клавиатуру всем окнам на экране, при помощи перемещения фокуса клавиатуры по указанию пользователя из одного окна в другое. Окно, которое имеет фокус клавиатуры, принимает (из очереди сообщений потока, который создал его) все сообщения клавиатуры, пока фокус не перейдет к другому окну.

Поток может вызывать функцию GetFocus, чтобы определить, которое из его окон (если есть в наличии) в настоящее время имеет фокус клавиатуры. Поток может дать фокус клавиатуры одному из своих окон, при помощи вызова функции SetFocus. Когда фокус клавиатуры меняет одно окно на другое, система отправляет сообщение WM_KILLFOCUS окну, которое потеряет фокус, а затем отправляет сообщение WM_SETFOCUS окну, которое получает фокус.

Концепция фокуса клавиатуры связывается с понятием активного окна. Активное окно (active window) — окно верхнего уровня, с которым пользователь в настоящее время работает. Окно с фокусом клавиатуры является или активным окном, или дочерним окном активного окна. Таким образом, чтобы пользователь мог легко идентифицировать активное окно, система размещает его сверху в Z-последовательности и делает выделенными область его заголовка (если оно является единственным) и рамку.

Пользователь может активизировать окно верхнего уровня, щелкнув по нему мышью, выбрать его, используя комбинацию клавиш ALT+TAB или ALT+ESC, или выбрать его, если оно в Списке Задач (Task List). Поток может активизировать окно верхнего уровня, используя функцию SetActiveWindow. Он может определить, является ли окно верхнего уровня, которое он создал активным, используя функцию GetActiveWindow.

Когда одно окно деактивизируется, а другое активизируется, Windows сначала отправляет сообщение WM_ACTIVATE деактивизируемому, а затем активизируемому окну. Младшее слово параметра wParam равно нулю, если окно деактивизируется, и отличается от нуля, если оно активизируется. Когда заданная по умолчанию оконная процедура принимает сообщение WM_ACTIVATE, она устанавливает фокус клавиатуры в активном окне.

Сообщения о нажатии клавиши

Нажатие клавиши заканчивается сообщением WM_KEYDOWN или WM_SYSKEYDOWN, помещаемое в очередь сообщений потока, связанного с окном, которое имеет фокус клавиатуры. Отпуск клавиши заканчивается сообщением WM_KEYUP или WM_SYSKEYUP, помещаемым в очередь.

Действия «клавиша отпущена» и «клавиша нажата» посылают сообщения, которые обычно происходят попарно, но если пользователь удерживает нажатой клавишу достаточно долго, чтобы запустить функцию клавиатуры автоматического повторения, система генерирует ряд сообщений WM_KEYDOWN или WM_SYSKEYDOWN. Она затем генерирует единственное сообщение WM_KEYUP или WM_SYSKEYUP, когда пользователь отпускает клавишу.

Системные и несистемные нажатия клавиш

Windows делает различие между системными и несистемными нажатиями клавиш. Системные нажатия клавиш производят системные сообщения WM_SYSKEYDOWN и WM_SYSKEYUP. Несистемные нажатия клавиш производят несистемные сообщения WM_KEYDOWN и WM_KEYUP.

Если ваша оконная процедура должна обработать сообщение системного нажатия клавиши, удостоверьтесь, что после обработки сообщения процедура посылает его в функцию DefWindowProc. Иначе, все системные действия, включающие клавишу ALT, будут заблокированы всякий раз, когда окно получает фокус клавиатуры. То есть пользователь не будет получать возможности обратиться к меню окна или Системному меню, или использовать комбинацию клавиш ALT+ESC или ALT+TAB, чтобы активизировать другое окно.

Сообщения о системном нажатии клавиши используются главным образом операционной системой Windows, а не прикладной программой. Windows использует их, чтобы предоставить свой встроенный интерфейс клавиатуры для меню и дать возможность пользователю управлять окном, которое является активным. Сообщения о системном нажатии клавиши создаются тогда, когда пользователь использует клавишу в комбинации с клавишей ALT, или когда пользователь вводит с клавиатуры, а ни у какого окна нет фокуса клавиатуры (например, когда активная прикладная программа свернута). В этом случае, сообщения посылаются в очередь сообщений, связанную с активным окном.

Сообщение о несистемном нажатии клавиши предназначены для использования окнами прикладной программы; функция DefWindowProc с ними не делает ничего. Оконная процедура может сбрасывать любые несистемные сообщения нажатия клавиши, которые ей не нужны.

Описание кодов виртуальной клавиши

Параметр wParam сообщения нажатия клавиши содержит код виртуальной клавиши, которая была нажата или отпущена. Оконная процедура обрабатывает или игнорирует сообщение о нажатии клавиши, что зависит от значения кода виртуальной клавиши.

Типичная оконная процедура обрабатывает только небольшое подмножество сообщений нажатия клавиши, которые она принимает и игнорирует остальные. Например, оконная процедура может обрабатывать только сообщения нажатия клавиши WM_KEYDOWN, и только те, которые содержат коды виртуальных клавиш для клавиш управления курсором, клавиши SHIFT (также называемой клавишей управления) и функциональных клавиш. Типичная оконная процедура не обрабатывает сообщения нажатия клавиши от символьных клавиш. Вместо этого, она использует функцию TranslateMessage, чтобы конвертировать сообщение в символьные сообщения. Для получения дополнительной информации о TranslateMessage и символьных сообщениях, см. Символьные сообщения.

Флажки сообщения о нажатии клавиши


Параметр lParam сообщения нажатия клавиши содержит дополнительную информацию о нажатии клавиши, которая генерировала сообщение. Эта информация включает в себя счет повторений, скэн-код, флажок дополнительной клавиши, код контекста, флажок предыдущего состояния клавиши и флажок переходного состояния.

Прикладная программа может использовать следующие значения, чтобы управлять флажками нажатия клавиши:

  • KF_ALTDOWN — Управляет флажком клавиши ALT, который указывает, нажата ли клавиша ALT.
  • KF_DLGMODE — Управляет флажком режима диалога, который указывает, является ли диалоговое окно активным.
  • KF_EXTENDED — Управляет флажком дополнительной клавиши.
  • KF_MENUMODE — Управляет флажком режима меню, который указывает, является ли меню активным.
  • KF_REPEAT — Управляет счетчиком повторений.
  • KF_UP — Управляет флажком переходного состояния.

Счетчик повторений

Вы можете проверить счетчик повторений, чтобы определить, представляет ли сообщение нажатия клавиши больше чем одно нажатие. Система увеличивает счетчик, когда клавиатура генерирует сообщения WM_KEYDOWN или WM_SYSKEYDOWN быстрее, чем прикладная программа может обрабатывать их. Это часто происходит тогда, когда пользователь удерживает нажатой клавишу достаточно долго, чтобы запустить функцию автоматического повторения клавиатуры. Вместо заполнения системной очереди сообщениями, происходящими в результате нажатия клавиши, система объединяет сообщения в единственное сообщение нажатой клавиши и увеличивает счет повторений. Отпуск клавиши не может запустить функцию автоматического повторения, так что счет повторений для сообщений WM_KEYUP и WM_SYSKEYUP всегда устанавливается в 1.

Скэн-код

Скэн-код — значение, которое аппаратные средства клавиатуры генерируют, когда пользователь нажимает клавишу. Это — аппаратно-зависимое значение, которое идентифицирует нажатую клавишу, в противоположность символу, представленному клавишей. Прикладная программа обычно игнорирует скэн-коды. Вместо этого, она использует не зависящие от устройства коды виртуальной клавиши, чтобы правильно понять сообщения нажатий клавиши.

Флажок дополнительной клавиши

Флажок дополнительной клавиши указывает, произошло ли сообщение нажатия клавиши от одной из дополнительных клавиш на расширенной клавиатуре. Дополнительные клавиши состоят из клавиш ALT и CTRL в правой части клавиатуры; INS, DEL, HOME, END, PAGE UP, PAGE DOWN и клавиши курсора в группах слева от цифровой клавиатуры; клавиша NUM LOCK; клавиша BREAK (CTRL+PAUSE); клавиша PRINT SCRN; делитель (/) и клавиши ENTER в цифровой клавиатуре. Флажок дополнительной клавиши устанавливается, если клавиша является дополнительной клавишей.

Контекстный Код

Контекстный код указывает, была ли клавиша ALT нажата тогда, когда было сгенерировано сообщение о нажатии клавиши. Если клавиша ALT была нажата, код будет 1 и 0, если этого не было.

Флажок предыдущего состояния клавиши

Флажок предыдущего состояния клавиши указывает, была ли клавиша, которая генерировала сообщение о нажатии, перед этим нажата или отпущена. Он будет 1, если клавиша в предыдущем состоянии была нажата и 0, если клавиша в предыдущем состоянии была отпущена. Вы можете использовать этот флажок, чтобы идентифицировать сообщения нажатия клавиши, сгенерированные автоматической функцией повторения клавиатуры. Этот флажок установлен в 1 для сообщений WM_KEYDOWN и WM_SYSKEYDOWN нажатия клавиши, сгенерированных автоматической функцией повторения. Он всегда устанавливается в 0 для сообщений WM_SYSKEYUP и WM_KEYUP.

Флажок переходного состояния

Флажок переходного состояния указывает, что генерировало сообщение нажатия клавиши — либо нажатие клавиши или отпуск её. Этот флажок всегда устанавливается в 0 для сообщений WM_SYSKEYDOWN и WM_KEYDOWN; он всегда устанавливается в 1 для сообщений WM_SYSKEYUP и WM_KEYUP.

Символьные сообщения

Сообщения о нажатии клавиши предоставляют много информации о нажатой клавише, но они не предусматривают кодов букв при нажатии символьных клавиш. Чтобы получить данные о кодах букв, прикладная программа должна включить функцию TranslateMessage в цикл сообщений своего потока. Функция TranslateMessage посылает сообщение WM_KEYDOWN или WM_SYSKEYDOWN раскладке символов на клавиатуре. Раскладка проверяет код виртуальной клавиши сообщения и, если он соответствует клавише знака, предоставляет эквивалент кода буквы (принимая во внимание состояние клавиш SHIFT и CAPS LOCK). Функция затем генерирует символьное сообщение, которое включает в себя код буквы и размещает сообщение сверху очереди сообщений. Следующий повтор цикла сообщения удаляет символьное сообщение из очереди и отсылает сообщение соответствующей оконной процедуре.

Несистемные символьные сообщения

Оконная процедура может принимать четыре различных символьных сообщения, включая WM_CHAR, WM_DEADCHAR, WM_SYSCHAR и WM_SYSDEADCHAR. Функция TranslateMessage генерирует сообщение WM_CHAR или WM_DEADCHAR тогда, когда она обрабатывает сообщение WM_KEYDOWN. Точно так же она генерирует сообщение WM_SYSCHAR или WM_SYSDEADCHAR тогда, когда обрабатывает сообщение WM_SYSKEYDOWN.

Прикладная программа, которая обрабатывает ввод информации с клавиатуры обычно, игнорирует все, кроме сообщения WM_CHAR, посылая любые другие сообщения функции DefWindowProc. Windows использует сообщения WM_SYSCHAR и WM_SYSDEADCHAR, чтобы осуществлять мнемонику меню.

Параметр wParam всех символьных сообщений содержит код буквы клавиши, которая была нажата. Значение кода буквы зависит от класса окна, принимающего сообщение. Если функция RegisterClass была использована, чтобы зарегистрировать класс окна в версии Уникода, система предоставляет символы Unicode всем окнам этого класса. И напротив, система предоставляет коды букв ASCII из набора символов Windows. Для получения дополнительной информации об Уникоде, см. Уникод и наборы символов.

Содержание параметра lParam символьного сообщения идентично содержанию параметра lParam сообщения о нажатии клавиши, которое было оттранслировано, чтобы произвести символьное сообщение. За информацией о содержании параметра lParam, см. Флажки сообщения о нажатии клавиши.

Сообщения о диакритическом знаке

Некоторые неанглийские клавиатуры содержат знаковые клавиши, которые не требуют создания своих символов. Вместо этого, они используются, чтобы добавить диакритический знак к символу, произведенному последующим нажатием клавиши. Эти клавиши — называются «мертвыми» клавишами (dead keys). Клавиша диакритического знака (A) над гласной (который по-другому называется циркумфлекс) в немецкой клавиатуре — пример «мертвой» клавиши. Чтобы ввести символ, состоящий из «o» с циркумфлексом, немецкий пользователь нажимает клавишу циркумфлекса, сопровождаемую нажатием клавиши «o». Окно с фокусом клавиатуры принимает следующую последовательность сообщений:

Функция TranslateMessage генерирует сообщение WM_DEADCHAR тогда, когда она обрабатывает сообщение WM_KEYDOWN от «мертвой» клавиши. Хотя параметр wParam сообщения WM_DEADCHAR содержит код буквы диакритического знака для мертвой клавиши, прикладная программа обычно игнорирует это сообщение. Вместо этого она обрабатывает сообщение WM_CHAR, сгенерированное последующим нажатием клавиши. Параметр wParam сообщения WM_CHAR содержит код буквы символа с диакритическим знаком. Если последующее нажатие клавиши генерирует символ, который не может быть объединен с диакритическим знаком, Windows генерирует два сообщения WM_CHAR. Параметр wParam первого содержит код буквы диакритического знака; параметр wParam второго содержит код буквы последующей знаковой клавиши.

Функция TranslateMessage генерирует сообщение WM_SYSDEADCHAR тогда, когда она обрабатывает сообщение WM_SYSKEYDOWN от системной «мертвой» клавиши («мертвая» клавиша, которая нажата в комбинации с клавишей ALT). Прикладная программа обычно игнорирует сообщение WM_SYSDEADCHAR.

Состояние клавиши

В ходе обработки сообщения клавиатуры, у прикладной программы возникает необходимость установить состояние другой клавиши кроме той, для которой сгенерировано текущее сообщение. Например, прикладная программа обработки текстов (текстовый процессор), которая позволяет пользователю нажимать SHIFT+END, чтобы выбрать блок текста, должна проверять состояние клавиши SHIFT всякий раз, когда она принимает сообщение о нажатии от клавиши END. Прикладная программа может использовать функцию GetKeyState, чтобы установить, было ли сгенерировано состояние виртуальной клавиши во время текущего сообщения; она может использовать функцию GetAsyncKeyState, чтобы получить данные о текущем состоянии виртуальной клавиши.

Раскладка символов на клавиатуре сохраняет список названий. Название клавиши, которая создает отдельный символ то же самое, что и символ, созданный клавишей. Название не символьной клавиши типа TAB и ENTER сохраняется как строка символов. Прикладная программа может извлекать данные о названии любой клавиши из драйвера устройства путем вызова функции GetKeyNameText.

Трансляции нажатия клавиши и символьной клавиши

Windows включает в себя несколько специальных функций, назначение которых, перевод скэн-кодов, кодов букв и кодов виртуальной клавиши при помощи предоставления различных сообщений о нажатии клавиши. Эти функции включают в себя MapVirtualKey, ToAscii, ToUnicode и VkKeyScan.

Поддержка «горячей» клавиши

Windows предоставляет набор функций, которые прикладные программы могут использовать, чтобы определить «горячую» клавишу. «Горячая» клавиша (hot key) — комбинация клавиш, которая генерирует сообщение WM_HOTKEY, сообщение, которое система помещает сверху очереди сообщений потока, обходя любые существующие сообщения в очереди. Прикладные программы используют «горячую» клавишу, чтобы получить первоочередной ввод информации с клавиатуры от пользователя. Например, определяя «горячую» клавишу, состоящую из комбинации клавиш CTRL+C, прикладная программа может дать возможность пользователю отменить затянувшуюся операцию.

Чтобы определить «горячую» клавишу, прикладная программа вызывает функцию RegisterHotKey, устанавливающую комбинацию клавиш, которая генерирует сообщение WM_HOTKEYWM_HOTKEY помещается в очередь сообщений потока, который создал данное окно. Параметр wParam сообщения содержит идентификатор «горячей» клавиши. Прикладная программа может определять многочисленные комбинации «горячая» клавиша для потока, но каждая «горячая» клавиша в потоке должна иметь уникальный идентификатор. Прежде, чем прикладная программа завершит свою работу, она должна использовать функцию UnregisterHotKey, чтобы уничтожить комбинацию «горячая» клавиша.

Прикладные программы могут использовать управление «горячей» клавишей, чтобы сделать себя легкодоступными для пользователя, который выбирает комбинацию «горячая клавиша». Элементы управления комбинацией «горячая» клавиша обычно используются, чтобы определить «горячую» клавишу, которая активизирует окно; они не используют функции RegisterHotKey и UnregisterHotKey. Вместо этого, прикладная программа, которая использует орган управления комбинацией «горячая» клавиша обычно, передает сообщение WM_SETHOTKEY, чтобы установить «горячую» клавишу. Всякий раз, когда пользователь нажимает «горячую» клавишу, система отправляет сообщение WM_SYSCOMMAND, устанавливающее SC_HOTKEY. Для получения дополнительной информации об элементах управления комбинацией «горячая клавиша», см. Органы управления «горячей » клавишей.

Языки, регионы и раскладки символов на клавиатуре

Язык (language) — естественный язык, такой как английский, французский и японский. Подмножество языка (sublanguange) — вариант естественного языка, на котором говорят в некоторых географических районах, типа английских подмножеств языка, на которых говорят в Великобритании и Соединенных Штатах. Базирующиеся на Win32 прикладные программы используют значения, называемые регионами (locales), чтобы уникально идентифицировать языки и их подмножества. Прикладные программы обычно используют регионы, чтобы установить язык, на котором обрабатывать ввод и вывод данных. Настройка региона для клавиатуры, например, воздействует на символьные значения, сгенерированные клавиатурой. Настройка региона для дисплея или принтера воздействует на глифы (образы символа в побитовом отображении), показанные на экране или напечатанные. Прикладные программы устанавливают регион для клавиатуры, загружая и используя раскладки символов на клавиатуре. Они устанавливают регион для дисплея или принтера, выбирая шрифт, который поддерживает данный географический район.

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


Каждая раскладка символов на клавиатуре имеет соответствующий дескриптор, который идентифицирует раскладку и язык. Младшее слово дескриптора — идентификатор языка. Старшее слово — дескриптор устройства, определяющего физическую раскладку, или равно нулю, указывая на заданную по умолчанию физическую раскладку. Пользователь может объединить любой язык ввода информации с данной физической раскладкой. Например, англоязычный пользователь, который очень редко работает по-французски, может установить язык ввода клавиатуры французский без изменения физической раскладки клавиатуры. Это означает, что пользователь может вводить текст на французском языке, используя знакомую английскую раскладку клавиатуры.

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

Функция ActivateKeyboardLayout устанавливает язык ввода для текущей задачи. Её параметр hkl может быть или дескриптор раскладки символов на клавиатуре или дополненный нулями идентификатор языка. Дескрипторы раскладки символов на клавиатуре могут быть получены из функции LoadKeyboardLayout или GetKeyboardLayoutList. Значения HKL_NEXT и HKL_PREV могут также быть использованы, чтобы выбрать следующую или предыдущую клавиатуру. Для некоторых операционных систем, значение KLF_UNLOADPREVIOUS не имеет никакого смысла и игнорируется.

Функция GetKeyboardLayoutName извлекает данные о названии активной раскладки символов на клавиатуре для вызывающего потока. Если прикладная программа создает активную раскладку, используя функцию LoadKeyboardLayout, GetKeyboardLayoutName извлекает ту же самую строку, которую использовали, чтобы создать раскладку. Иначе, эта строка — первичный идентификатор языка, соответствующий региону активной раскладки. Это означает, что функция не обязательно может различать между собой различные раскладки с тем же самым первичным языком, так как не может возвратить конкретную информацию о языке ввода. Тем не менее, функция GetKeyboardLayout может быть использована, чтобы установить язык ввода информации.

Функция LoadKeyboardLayout загружает раскладку символов на клавиатуре и делает её доступной пользователю. Прикладные программы могут делать раскладку активной непосредственно для текущего потока, используя значение KLF_ACTIVATE. Прикладная программа может использовать значение KLF_REORDER, чтобы переупорядочить раскладки без такой установки значения KLF_ACTIVATE. Прикладные программы должны всегда использовать значение KLF_SUBSTITUTE_OK при загрузке раскладок символов на клавиатуре, чтобы гарантировать, что предпочтение пользователя, если таковое вообще имеются, обеспечено. Для некоторых операционных систем, значение KLF_UNLOADPREVIOUS игнорируется.

Для многоязычной поддержки, функция LoadKeyboardLayout предоставляет флажки KLF_NOTELLSHELL и KLF_REPLACELANG. Флажок KLF_REPLACELANG предписывает функции поменять существующую раскладку символов на клавиатуре без изменения языка. Попытка заменить существующую раскладку, используя тот же самый идентификатор языка, но без установки KLF_REPLACELANG, является ошибкой. Флажок KLF_NOTELLSHELL ограждает функцию от уведомления оболочки, когда раскладка символов на клавиатуре добавлена или заменена. Это полезно для прикладных программ, которые прибавляют многочисленные раскладки в ряде последующих обращений. Этот флажок должен быть использоваться у всех, но при последнем вызове.

Функция UnloadKeyboardLayout ограничена в том, что она не может выгрузить из системы язык ввода по умолчанию. Это гарантирует то, что пользователь всегда имеет одну раскладку, доступную для ввода текста, которая использует тот же самый набор символов, какой используется оболочкой и файловой системой.

Использование ввода информации с клавиатуры

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

Обработка сообщений о нажатии клавиши

Оконная процедура окна, которое имеет фокус клавиатуры, принимает сообщения о нажатии клавиши, когда пользователь печатает на клавиатуре. Сообщения о нажатии клавиши — WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN и WM_SYSKEYUP. Типичная оконная процедура игнорирует все сообщения о нажатии клавиши кроме WM_KEYDOWN. Windows посылает сообщение WM_KEYDOWN, когда пользователь нажимает клавишу.

Когда оконная процедура принимает сообщение WM_KEYDOWN, она должна проверить код виртуальной клавиши, который сопровождает сообщение, чтобы установить, как обработать нажатие клавиши. Код виртуальной клавиши находится в параметре wParam сообщения. Как правило, приложение обрабатывает только нажатия клавиши, сгенерированные не символьными клавишами, включая функциональные клавиши, клавиши управления курсором, и клавиши специального назначения типа INS, DEL, HOME и END.

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

Трансляция символьных сообщений

Любой поток, который принимает символьный ввод информации от пользователя, должен включать в свой цикл сообщений функцию TranslateMessage. Эта функция проверяет в сообщении о нажатии клавиши ее виртуальный код и, если код соответствует символу, помещает символьное сообщение в очередь сообщений. Символьное сообщение удаляется и отправляется при следующем повторении цикла сообщения; параметр wParam сообщения содержит код буквы.

Вообще, цикл сообщения потока должен использовать функцию TranslateMessage, чтобы транслировать каждое сообщение, а не только сообщения виртуальных клавиш. Хотя TranslateMessage не имеет никакого влияния на другие типы сообщений, она гарантирует, что ввод информации с клавиатуры оттранслируется правильно. Следующий пример показывает, как включить функцию TranslateMessage в типичный цикл сообщений потока.

Обработка символьных сообщений

Оконная процедура принимает символьное сообщение тогда, когда функция TranslateMessage транслирует код виртуальной клавиши соответствующий клавише знака. Символьными сообщениями являются WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, и WM_SYSDEADCHAR. Типичная оконная процедура игнорирует все символьные сообщения кроме WM_CHAR. Функция TranslateMessage генерирует сообщение WM_CHAR тогда, когда пользователь нажимает какую-либо из следующих клавиш.

Когда оконная процедура принимает сообщение WM_CHAR, она должна проверить код буквы, который сопровождает сообщение, чтобы установить, как обрабатывать символ. Код буквы находится в параметре wParam сообщения.

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

Использование каретки

Окно, которое принимает ввод информации с клавиатуры, обычно отображает символы, которые пользователь вводит с клавиатуры в рабочей области окна. Окно должно использовать каретку, чтобы указать позицию в рабочей области, где появится следующий символ. Окно должно также создавать и показывать на экране каретку, когда оно принимает фокус клавиатуры и скрывать и уничтожать каретку, когда оно теряет фокус. Окно может исполнять эти операции в ходе обработки сообщений WM_KILLFOCUS и WM_SETFOCUS. Для получения дополнительной информации о каретках, см. главу Каретки.

Отображение ввода информации с клавиатуры

Пример в этом разделе показывает, как прикладная программа может принимать символы от клавиатуры, отображать их в рабочей области окна и обновлять позицию каретки с каждым напечатанным символом. Он также демонстрирует, и как переместить каретку в ответ на нажатие клавиш LEFT ARROW (стрелка влево), RIGHT ARROW (стрелка вправо), HOME (вверх документа) и END (в конец документа), и показывает, как выделить выбранный текст в ответ на нажатие комбинации клавиш SHIFT+RIGHT ARROW.

В ходе обработки сообщения WM_CREATE, оконная процедура, показанная в примере, назначает буфер 64КБ для сохранения ввода информации с клавиатуры. Она также извлекает данные о метрике в настоящее время загруженного шрифта, сохраняя высоту и среднюю ширину символов в шрифте. Высота и ширина используются при обработке сообщения WM_SIZE, чтобы вычислить длину строки и максимальное число строк, основываясь на размере рабочей области.

Оконная процедура создает и отображает на экране каретку при обработке сообщения WM_SETFOCUS. Она скрывает и удаляет каретку при обработке сообщения WM_KILLFOCUS.

При обработке сообщения WM_CHAR, оконная процедура отображает символы, сохраненные ею в буфере вводимой информации, и обновляет позицию каретки. Оконная процедура также преобразует и символы табуляции в четыре последовательных пробела. Возврат на один символ, перевод строки и знаки перехода генерируют гудок, а иначе, не обрабатываются.

Оконная процедура исполняет движения каретки влево, вправо, в конец и в исходную позицию при обработке сообщения WM_KEYDOWN. При обработке действия клавиши RIGHT ARROW (стрелки «вправо»), оконная процедура проверяет состояние клавиши SHIFT и, если она нажата, выбирает символ справа от каретки, поскольку каретка перемещается.

Обратите внимание! на то, что нижеследующий код написан так, чтобы его можно было откомпилировать или как Уникод ™ или как ANSI. Если исходный текст определяет Уникод, строки обрабатываются как символы Уникода; иначе, они обрабатываются как символы ANSI.

КАК взаимодействуют окно и клавиатура?

В программах MS-DOS клавиатуре выделено важное, почти главенствующее место. Почти всё взаимодействие с пользователем построено на работе с клавиатурой, и работа без неё кажется там немыслимой. Если мышь и используется в DOS, то только по прихоти заботливого программиста.
В Windows большинство действий мы делаем мышью, поэтому на первый взгляд применение клавиатуры ограничено вводом числовых данных в поля ввода. Но на второй взгляд мы вспоминаем про горячие клавиши типа Ctrl+S, Ctrl+N и Shift+F12, а также про компьютерные игры, где почти всё завязано на клавиатуре.
Подобно любой программе DOS, окно Windows может работать с клавиатурой. Когда вы нажимаете какие-либо кнопки, окно получает от клавиатуры сообщения. В зависимости от того, что вы хотите делать, это могут быть сообщения: WM_CHAR (работа с текстовыми (символьными) кнопками), WM_KEYDOWN (нажатие клавиш), WM_KEYUP (отпускание клавиш) — иногда бывает нужно произвести какое-то действие только когда пользователь отпустит кнопку, например при перетаскивании с нажатым Shft.

Как и при работе с DOS, все клавиши имеют свои коды. Причём код просто нажатой клавиши ‘S’ отличается от той же ‘S’ нажатой вместе с ‘Ctrl’. С помощью конструкции switch/case мы можем отслеживать нажатие нужных нам кнопок (например стрелок, управляющих героем игры) и производить какие-то ответные действия — движение, стрельба, прыжки.

Остаётся только узнать эти коды. Их можно посмотреть в справочнике по программированию или самому написать программу, которая выводит на экран коды клавиш и их сочетаний. Чем мы сейчас и займёмся.

Создайте новый пустой проект Win32, который назовём: «MyKey». В папке проекта создадим новый текстовый файл и сохраним его под именем MyKey.cpp. В нём будет исходный текст программы. Добавим его в проект с помощью команды меню: Project->Add to project->Files (Project->Add Existing Item для 7-й версии). Теперь наберите в этот файл следующий текст:

//Отображение кодов нажатых клавиш

//Создаём прототип функции окна
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

char szProgName[]=»Progname»; //имя программы
char szText[]=»»;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
<

HWND hWnd; //идентификатор окна
MSG lpMsg; //идентификатор сообщения
WNDCLASS w; //создаём экземпляр структуры WNDCLASS


//И начинаем её заполнять
w.lpsz > w.hInstance=hInstance; //идентификатор текущего приложения
w.lpfnWndProc=WndProc; //указатель на функцию окна
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.hIcon=LoadIcon(hInstance, IDI_APPLICATION);
w.lpszMenuName=0; //меню пока не будет
w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна
w.style=CS_HREDRAW|CS_VREDRAW; //стиль — перерисовываемое по х и по у
w.cbClsExtra=0;
w.cbWndExtra=0;

//Если не удалось зарегистрировать класс окна — выходим
if(!RegisterClass(&w))
return 0;

//Создадим окно в памяти, заполнив аргументы CreateWindow
hWnd=CreateWindow(szProgName, //Имя программы
«Keyboard Code Viewer — 1.0», //Заголовок окна
WS_OVERLAPPEDWINDOW, //Стиль окна — перекрывающееся
100, //положение окна на экране по х
100, //по у
100, //размеры по х
80, //по у
(HWND)NULL, //идентификатор родительского окна
(HMENU)NULL, //идентификатор меню
(HINSTANCE)hInstance, //идентификатор экземпляра программы
(HINSTANCE)NULL); //отсутствие дополнительных параметров

//Выводим окно из памяти на экран
ShowWindow(hWnd, nCmdShow);
//Обновим содержимое окна
UpdateWindow(hWnd);

//Цикл обработки сообщений

while(GetMessage(&lpMsg, NULL, 0, 0)) < //Получаем сообщение из очереди
TranslateMessage(&lpMsg); //Преобразует сообщения клавиш в символы
DispatchMessage(&lpMsg); //Передаёт сообщение соответствующей функции окна
>
return(lpMsg.wParam);
>

//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,
WPARAM wParam, LPARAM lParam)
<
HDC hdc; //создаём идентификатор контекста устройства

//Цикл обработки сообщений
switch(messg)
<

unsigned int key;

//Обработка нажатия клавиши
case WM_KEYDOWN:
key=wParam; //Получаем код нажатой клавиши
_itoa(key, szText, 10); //Преобразуем его в строку
hdc=GetDC(hWnd); //Получаем контекст рисования
TextOut(hdc, 10,10, szText, 2); //Выводим текст на экран
break;

//сообщение выхода
case WM_DESTROY:
PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 — нормальное завершение
break;

default:
return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
>
return 0;
>

Текст этот почти полностью нам знаком. Единственное белое пятно — обработка сообщения WM_KEYDOWN в цикле обработки сообщений.
Рассмотрим его поподробней:

case WM_KEYDOWN:
key=wParam; //Получаем код нажатой клавиши
_itoa(key, szText, 10); //Преобразуем его в строку
hdc=GetDC(hWnd); //Получаем контекст рисования
TextOut(hdc, 10,10, szText, 2); //Выводим текст на экран
break;

Мы присваиваем целой переменной key значение переменной wParam. После получения окном сообщения WM_KEYDOWN, оно записывает в него код нажатой клавиши. Так как это целое число, его необходимо преобразовать в строку, чтобы вывести на экран. Этим занимается функция _itoa, которая аналогична подобной функции DOS. После этого, в строке szText у нас будет код в виде строки, который не стыдно вывести на экран.

КАК это применить?

Допустим, нам нужно отловить сочетание Ctrl+S. Запустив программу, мы узнаём, что код этого сочетания = 83. Тогда наша первоначальная конструкция будет несколько видоизменена:

case WM_KEYDOWN:
key=wParam; //Получаем код нажатой клавиши

//Обработка нажатия клавиш
switch(key) <
case 83:

MessageBox(hWnd, «Ваше данные сохранены», «», MB_OK);

break;
//Здесь могут быть и другие case
>

Не правда ли это напоминает аналогичную DOS программу?

key=getch();
switch(key) <
case 83:
printf(«Данные сохранены!»);
break;
>

Какими далёкими кажутся теперь эти строки!

Теперь создадим программу, печатающую вводимые нами символы. Используем сообщение от WM_CHAR. Казалось, бы, зачем вообще нужно WM_CHAR, если есть WM_KEYDOWN? Ан нет! WM_CHAR полностью игнорирует нажимаемые нами клавиши, если это не символы букв и цифр. Это удобно, если мы хотим создать свой текстовый редактор или программу, получающую данные из строки ввода, как в DOS. Нам не надо писать подпрограмму, в которой фильтруются коды клавиш. Всё уже сделано за нас. Будет это выгледять так:

case WM_CHAR:
key=wParam;
wsprintf(szText, «%c», key);
hdc=GetDC(hWnd); //Получаем контекст рисования
TextOut(hdc, 10,10, szText, 1); //Выводим текст на экран
break;

Точно так же мы получаем код и записываем его в key. Затем используем функцию wsprintf, аналогичную sprintf в MS-DOS, копируя в строку символ. Затем выводим эту строку на экран. Закомментируйте в предыдущей программе сообщение WM_KEYDOWN и замените его этим. На экран будет выводиться по одному символу.

Если же вы хотите, чтобы каретка перемещалась, сделайте координаты TextOut динамичными. Пусть при нажатии клавиши, координата по X увеличивается, а при нажатии Enter увеличивается координата по y. Можно ещё отловить Return и обеспечить затирание введённого символа.

Так программа обрабатывает символьные клавиши.

Win32 API позволяет вам обрабатывать нажатие совершенно любой клавиши! Хотите, чтобы ваш герой стрелял кнопкой ‘Ctrl’? Нет ничего проще! Хотите, чтобы в вашей программе пауза наступала при нажатии кнопки «Pause» — что может быть проще!

В отличие от WM_KEYDOWN, WM_CHAR работает не с числовыми кодами клавиш, а с их шестнадцатиричными эквивалентами. Например, Enter будет 0xd, а 0x20 — пробел. Эти коды запомнить навозможно, поэтому придумали универсальную таблицу виртуальных клавиш, где все эти коды подменены идентификаторами, которые делают и программирование упрощают и текст программы делают понятней для чтения. Причём, эти идентификаторы годятся в работе и с WM_CHAR и с WM_KEYDOWN.
Их обозначают с префиксом VK (Virtual Key): VK_RETURN — Enter, VK_TAB — Tab и т.д.

По таблице виртульных клавиш вы всегда сможете узнать код нужной кнопки.

Таблица виртуальных клавиш.

Возвращаемое значение

Числовое. INKEY( ) возвращает = 0, если клавиша не нажималась. Если в клавиатурном буфере находится несколько кодов клавиш, то функция INKEY( ) возвращает код первой клавиши из указанного буфера. INKEY( ) возвращает соответствующие коды в зависимости от следующих обстоятельств:

Если ключ M включен в параметр cHideCursor , INKEY( ) возвращает значение = 151.

Если ключ E включен в параметр, INKEY( ) возвращает код первой клавиши из сложного клавиатурного Макро. Если ключ E — отсутствует, INKEY( ) возвращает код главной клавиши клавиатурного Макро.

Для одиночных клавиш или их комбинаций со специальными клавишами: SHIFT, CTRL, или ALT, в следующей таблице представлены возвращаемые значения функцией INKEY( ) . Прочерк (–) означает, что возвращаемое значение отсутствует .

прикладная математика

Расширенные коды клавиш

Нажатие клавиши преобразуется в двухбайтовый код, называемый скан-ASCII-кодом. Этот код помещается в буфер клавиатуры, откуда ваша программа может считать его с помощью прерывания системы BIOS. Старший байт двухбайтового кода называется скан-кодом и является отображением фактически нажатой клавиши. Скан-код не отражает состояние клавиш Shift, Ctrl или Alt и не является уникальным. Помимо скан-кодов нажатия, существуют коды отпускания клавиш, отличающиеся на шестнадцатеричное значение 80 в сторону увеличения. Младший байт полного кода, называемый ASCII-кодом, также не является уникальным, но полная комбинация скан и ASCII-кода уникальна. Некоторые клавиши не имеют ASCII-кода и вместо него возвращается ноль. Такие двухбайтовые коды называются расширенными. При приеме кода нажатой клавиши через DOS последняя отделяет от общего значения скан-код. Кроме того, работающий в системе русификатор может дополнительно транслировать скан-коды буквенных клавиш в ASCII-коды русских букв.

Исходя из сказанного, при использовании стандартной функции readkey, работающей с ASCII-кодами клавиш, в общем случае является правильной следующая схема обработки на Паскале:

На Паскале десятичный код может быть записан в виде #N, где N — число, например, #65 (‘A’ латинская). ASCII-коды основных печатных символов можно узнать из таблицы кодов. Наиболее востребованные коды приведены в табл.1, 2.

Таблица 1. ASCII-коды некоторых клавиш

«Запись в микроблоге: У всего есть обратная сторона. Первый комментарий: Даже у ленты Мебиуса? «

Код нажатой клавиши

— Код последней нажатой клавиши

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

Узнать его достаточно просто, используя данную страницу. Достаточно просто нажать любую клавишу и вы узнаете ее код, который отобразится выше.

Используем код нажатой клавиши

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

Если вы нажали ctrl+c, например, то на странице вы увидите код той клавиши, которую ОТПУСТИЛИ последней

Илон Маск рекомендует:  Что такое код asp domaingrant
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL