как узнать коды клавиш на клавиатуре

Скан-код: Ремаппинг клавиш на клавиатуре

Что такое Скан-код

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

Как определить Скан-код клавиши

Узнать Скан-код необходимой для ремаппинга клавиши вы можете здесь, а если у вас супер новая клавиатура с кнопками космического происхождения, то отловить скан-код вы можете используя программу «KeyboardTest» от разработчика Passmark Software. Программка платная, но бесплатным триалом. Или OpenSource Программу SharpKeys. Она потребовалась для определения скан-кода левой «\», так как многие наивно полагали что сигналы у обеих одинаковые, а значит и не подлежат ремаппингу. На деле оказалось не так.

И так, мы определили скан-код нашей незадачливой кнопки, теперь нам нужно найти скан-код «LShift». Его можно найти по данной выше ссылке и он равен: 2A.00

Ремаппинг клавиш

Есть куча приложений которые делают этот ремаппинг, многие за базу принимают существующие скан-коды, многие не имеют сканера, что бы определить скан-код клавиши которой нет в базе. Да и устанавливать лишнее приложение очень не хотелось. По-гуглив я остановился на возможностях Windows. а точнее редактора реестра (Пуск-Выполнить: regedit). Или вышеупомянутую программу SharpKeys, которая имеет GUI и выполняет такую же замену в реестре

1. В ветке
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
создайте бинарный параметр с именем «Scancode Map»
2. В параметр «Scancode Map» записываем следующие значения:
00.00.00.00.00.00.00.00.02 — девятый байт (02) в этой записи означает количество клавиш которое мы будем менять (и равен количеству клавиш +1) в нашем случае это 02, так как мы меняем значения одной клавиши. После этого вписываем еще три «пустых» байта, и теперь наш параметр выглядит так:
00.00.00.00.00.00.00.00.02.00.00.00.
Поскольку мы уже определили все Скан-коды, то продолжая наш параметр, нам следует указать скан-код значения новой кнопки (в нашем случае это 2A.00), а затем скан-код старой (заменяемой) кнопки 56.00. Теперь необходимо закрыть эту функцию четырьмя «пустыми» байтами, то есть 00.00.00.00:
как узнать коды клавиш на клавиатуре. c192u4V69B. как узнать коды клавиш на клавиатуре фото. как узнать коды клавиш на клавиатуре-c192u4V69B. картинка как узнать коды клавиш на клавиатуре. картинка c192u4V69B.
3. Перезагружаем компьютер и пользуемся нашими новыми кнопками.

PS: Если нужно сделать ремаппинг не на всем ПК, а только в вашем сеансе, то значения необходимо менять в HKEY_CURRENT_USER\SYSTEM\CurrentControlSet\Control\Keyboard Layout

UPD: Если вы боитесь работать в реесте, то создайте текстовый файл с расширением *.reg, и впишите туда следующее:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
«Scancode Map»=hex:00,00,00,00,00,00,00,00,02,00,00,00,2a,00,56,00,00,00,00,00
затем сохраните, запустите, и перезагрузите ПК.

UPD2: Перенос Скриншотов на
1. Левый Win-key выглядит так:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
«Scancode Map»=hex:00,00,00,00,00,00,00,00,02,00,00,00,37,E0,5B,E0,00,00,00,00
Правый Win-key выглядит так:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
«Scancode Map»=hex:00,00,00,00,00,00,00,00,02,00,00,00,37,E0,5C,E0,00,00,00,00

Источник

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

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

Клавиша

Дес.
число

Шест.
число

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

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

F1112$70VK_F1F2113$71VK_F2F3114$72VK_F3F4115$73VK_F4F5116$74VK_F5F6117$75VK_F6F7118$76VK_F7F8119$77VK_F8F9120$78VK_F9F10121$79VK_F10пробел32$20VK_SPACEBackSpace8$8VK_BACKTab9$9VK_TABEnter13$0DVK_RETURNShift16$10VK_SHIFTCtrl17$11VK_CONTROLAlt18$12VK_MENUCapsLock20$14VK_CAPITALEsc27$1BVK_ESCAPEInsert45$2DVK_INSERTPageUp33$21VK_PRIORPageDown34$22VK_NEXTEnd35$23VK_ENDHome36$24VK_HOMEСтрелка назад37$25VK_LEFTСтрелка вверх38$26VK_UPСтрелка вперед39$27VK_RIGHTСтрелка вниз40$28VK_DOWNDelete46$2EVK_DELETEPrintScreen44$2CVK_SNAPSHOTScrollLock145$91VK_SCROLLPause19$13VK_PAUSENumLock144$90VK_NUMLOCK0,)48$30Ord(‘0’)1!49$31Ord(‘1’)2@50$32Ord(‘2’)3#51$33Ord(‘3’)4$52$34Ord(‘4’)5%53$35Ord(‘5’)6^54$36Ord(‘6’)7&55$37Ord(‘7’)8*56$38Ord(‘8’)9(57$39Ord(‘9’)`

192$C0-_189$BD=+187$BB[ <219$DB]>221$DD:;186$BA‘”222$DE|220$DC,190$BE/?191$BFA a65$41Ord(‘A’)B b66$42Ord(‘B’)С с67$43Ord(‘С’)D d68$44Ord(‘D’)E e69$45Ord(‘E’)F f70$46Ord(‘F’)G g71$47Ord(‘G’)H h72$48Ord(‘H’)I i73$49Ord(‘I’)J j74$4AOrd(‘J’)K k75$4BOrd(‘K’)L l76$4COrd(‘L’)M m77$4DOrd(‘M’)N n78$4EOrd(‘N’)O o79$4FOrd(‘O’)P p80$50Ord(‘P’)Q q81$51Ord(‘Q’)R r82$52Ord(‘R’)S s83$53Ord(‘S’)T t84$54Ord(‘T’)U u85$55Ord(‘U’)V v86$56Ord(‘V’)W w87$57Ord(‘W’)X x88$58Ord(‘X’)Y y89$59Ord(‘Y’)Z z90$5AOrd(‘Z’)

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

Клавиша

Дес.
число

Шест.
число

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

Источник

Непосредственная работа с клавиатурой


Автор: Stanky
Источник: RSDN Magazine #1-2005

Опубликовано: 27.08.2005
Исправлено: 10.12.2016
Версия текста: 1.0

как узнать коды клавиш на клавиатуре. mag0105. как узнать коды клавиш на клавиатуре фото. как узнать коды клавиш на клавиатуре-mag0105. картинка как узнать коды клавиш на клавиатуре. картинка mag0105.

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

В этой статье я расскажу о низкоуровневой работе с клавиатурой и приведу пример реализации простого обработчика клавиатурного прерывания для реального режима (драйвер).

При нажатии на какую либо клавишу электроника клавиатуры генерирует скан-код клавиши длиной от 1 до 6 байт, который можно получить чтением порта ввода-вывода 0x60. Скан-код – уникальное число, однозначно определяющее нажатую клавишу, но не ASCII-код. Скан-коды бывают двух видов: при нажатии клавиши генерируется так называемый Make-код, а при её отпускании Break-код. Отличаются они лишь тем, что в Break-коде старший бит каждого байта установлен в единицу. Скан-коды делятся на группы: обычные, расширенные, дополнительные и код клавиши Pause. Обычный скан-код состоит из одного байта, расширенный – из 2-х байт, первый из которых – 0xE0. Длина дополнительного кода – от 2 до 4 байт. Он так же начинается с 0xE0. Очень сильно из колеи выбивается Pause – это единственная клавиша, код которой состоит из 6 байт, причем Break-код у неё отсутствует.

Клавиатура может работать в двух режимах: по опросу и по прерыванию. Я рассматриваю только второй режим, так как первый менее эффективен и его реализация проще. Когда во входном буфере клавиатуры есть какие-либо данные, происходит запрос прерывания по линии IRQ1. Помимо самих скан-кодов, клавиатура может передавать компьютеру специальные коды при выполнении команд (например, изменение состояния светодиодов).

ПРИМЕЧАНИЕ

По ходу статьи предполагается, что клавиатура работает в режиме «по умолчанию»: установлен набор скан-кодов Set2, большинство клавиш работают в режиме автоповтора и т. д.

Таблица скан-кодов клавиатуры:


KeyMake (HEX)Break (HEX)
Num Lock45C5
Num DivideE0 35E0 B5
Num Multiply37B7
Num Minus4ACA
Num Plus4ECE
Num EnterE0 1CE0 9C
Num Dot53D3
Num 052D2
Num 14FCF
Num 250D0
Num 351D1
Num 44BCB
Num 54CCC
Num 64DCD
Num 747C7
Num 848C8
Num 949C9
Print ScreenE0 2A E0 37E0 B7 E0 AA
Scroll Lock46C6
PauseE1 1D 45 E1 9D C5
InsertE0 2A E0 52E0 D2 E0 AA
HomeE0 2A E0 47E0 C7 E0 AA
Page UpE0 2A E0 49E0 C9 E0 AA
DeleteE0 2A E0 53E0 D3 E0 AA
EndE0 2A E0 4FE0 CF E0 AA
Page DownE0 2A E0 51E0 D1 E0 AA
Arrow UpE0 2A E0 48E0 C8 E0 AA
Arrow LeftE0 2A E0 4BE0 CB E0 AA
Arrow DownE0 2A E0 50E0 D0 E0 AA
Arrow RightE0 2A E0 4DE0 CD E0 AA
PowerE0 5EE0 DE
SleepE0 5FE0 DF
Wake UpE0 63E0 E3
Esc0181
F13BBB
F23CBC
F33DBD
F43EBE
F53FBF
F640C0
F741C1
F842C2
F943C3
F1044C4
F1157D7
F1258D8
Tab0F8F
Caps Lock3ABA
Shift Left2AAA
Shift Right36B6
Ctrl Left1D9D
Ctrl RightE0 1DE0 9D
Alt Left38B8
Alt RightE0 38E0 B8
Win LeftE0 5BE0 DB
Win RightE0 5CE0 DC
ApplicationsE0 5DE0 DD
Space39B9
Enter1C9C
Back Space0E8E
10282
20383
30484
40585
50686
60787
70888
80989
90A8A
00B8B
Q1090
W1191
E1292
R1393
T1494
Y1595
U1696
I1797
O1898
P1999
A1E9E
S1F9F
D20A0
F21A1
G22A2
H23A3
J24A4
K25A5
L26A6
Z2CAC
X2DAD
C2EAE
V2FAF
B30B0
N31B1
M32B2
29A9
0C8C
=0D8D
\2BAB
[1A9A
]1B9B
;27A7
«28A8
34B4
?35B5
ПРИМЕЧАНИЕ

Если повнимательнее присмотреться к скан-коду клавиши Pause (E1 1D 45 E1 9D C5), можно заметить, что первые 3 байта являются Make-кодом, а вторые Break-кодом. То есть клавиатура при её нажатии генерирует сразу же и код нажатия и отжатия. В дальнейшем это немного упростит нам жизнь.

Если нажать клавишу и удерживать её, то через заданное время, называемое временем автоповтора, скан-код удерживаемой клавиши будет повторяться с частотой автоповтора. При автоповторе дополнительные скан-коды содержат два байта вместо четырех. Например, последовательность байт при удержании и отпускании клавиши Page Up (E0 2A E0 49) выглядит так: E0 2A E0 49 E0 49 E0 49 E0 49 E0 49 E0 49 E0 49 E0 C9 E0 AA. Обратите внимание: при отпускании клавиши с дополнительным кодом последовательность перевёрнута – признак дополнительного кода (E0 AA) идёт в конце, а не в начале.

Следующие позиции в таблице скан-кодов заняты и однозначно не могут быть использованы другими клавишами (и, соответственно, нами):

Всем расширенным скан-кодам предшествует байт 0x0E, а дополнительным – последовательность байт 0xE0, 0x2A, 0xE0.

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

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

Для информирования о том, что скан-код является расширенным или дополнительным, используются значения 0xE0, 0x2A/0xAA и 0xE1 для Pause. Этот факт однозначно говорит о том, что эти значения также не используются ни одной из клавиш – иначе определить нажатую/отжатую клавишу было бы просто невозможно.

Введём понятие виртуальной клавиши – это номер, определяющий функцию клавиши. Например: Ctrl исполнен в виде двух физических клавиш, но их виртуальный код – один и тот же.

ПРЕДУПРЕЖДЕНИЕ

Мои определения виртуальных клавиш несколько отличаются от используемых в Windows, хотя и очень похожи на них.

Создадим таблицу трансляции скан-кодов в виртуальные клавиши, состоящую из 256 элементов по 2 байта каждый. В первом байте мы будем хранить сам виртуальный код клавиши, а во втором – некоторые атрибуты.

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

Поскольку мы обнуляем старший разряд, все значения в промежутке [128 – 255] таблицы трансляции свободны для наших нужд. Виртуальные коды расширенных и дополнительных клавиш мы будем хранить именно в этом диапазоне. Поступим следующим образом: если скан-код является расширенным или дополнительным (Pause пока отбросим), то установим в единицу старший разряд в его последнем байте.

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

Начнём с рассмотрения дополнительных клавиш. Все они начинаются с байта 0xE0. Модифицируем ранее приведённое правило: если виртуальный код, полученный из таблицы трансляции, равен нулю, то виртуальный код не готов и скан-код ещё не принят полностью. Отбросив старший разряд у 0xE0, мы получим значение 0x60 (которое также не используется ни одной клавишей), которое можно использовать в качестве индекса, по которому будет храниться значение 0. При обработке следующего прерывания мы получим последний байт скан-кода, у которого и должны установить старший разряд. Проще всего это сделать, модифицировав правило преобразования. Вспомним о том, что у нас имеется ещё и байт атрибутов в таблице, который до сих пор никак не задействован. Новое правило будет выглядеть так: при каждом получении значения из таблицы будем сохранять его в переменной, а при формировании индекса будем использовать какой-либо разряд байта атрибутов, отражающий, что необходимо изменить старший разряд полученного байта.

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

Давайте разберём всё вышеизложенное на примере клавиши Ctrl Right (E0 1D):

Назовём переменную, которая должна хранить байт виртуального кода и байт атрибутов, KeyInfo. Инициализируем ее значением 0. Первый получаемый байт имеет значение 0xE0. Обнуляем старший разряд и получаем 0x60. Берём старший разряд байта атрибутов из переменной KeyInfo и переносим его в старший разряд полученного индекса: (0xE0 & 0x7F) | ((KeyInfo >> 8) & 0x80). В итоге получаем индекс 0x60, по которому в таблице будет храниться виртуальный код с нулевым значением и байт атрибутов с установленным старшим разрядом: KeyInfo = 0x8000. Следующий байт в последовательности 0x1D: KeyInfo = Table[(0x1D & 0x7F) | ((KeyInfo >> 8) & 0x80)] == 0x9D – вот мы и получили конечный индекс, по которому в таблице будет находиться виртуальный код.

Едем дальше – на очереди дополнительные коды. Отличаются они лишь тем, что первые 2 байта имеют значение 0xE0, 0x2A. Самый простой способ их приёма даже не потребует изменений правила получения индекса. После получения 0xE0 байт 0x2A превратится в индекс 0xAA, по которому будем хранить значение 0, указывающее на то, что виртуальный код не готов, и модифицировать старший разряд следующего байта не нужно (как будто бы этой последовательности и вовсе не было). Следующие 2 байта последовательности ничем не отличаются от расширенного скан-кода, и для их приёма уже всё готово.

ПРИМЕЧАНИЕ

Всё вышеизложенное прекрасно работает при получении 2 байт вместо 4 при автоповторе и обратном порядке следования пар при отпускании. Причём при отпускании первые 2 байта дадут виртуальный код отжатой клавиши, а последние 2 (E0 AA) будут преобразованы в 0x0000 (проигнорированы).

Но как вы уже, наверное, забыли, мы отбросили клавишу Pause (E1 1D 45) – давайте теперь разберёмся и с ней. Если пойти по предыдущему пути, и по индексу 0x61 (0xE1 & 0x7F) хранить значение 0x8000, то мы получим коллизию, связанную с правым Ctrl’ом (E0 1D). Что же нам в этом случае делать? Ну что ж, будем в очередной раз модифицировать наше правило получения индекса: посмотрим на двоичное представление числа 0x1D – 0001 1101. Чтоб не возникло коллизий, можно, например, модифицировать 5-й, 6-й, или оба разряда вместе, или 7-й и 1-й, но раз уж мы начали модифицировать старшие разряды, то давайте продолжим. Новое правило получения индекса будет таким: (Value & 0x7F) | ((KeyInfo >> 8) & 0xC0). Но на этом наши мучения с клавишей Pause не закончились. По индексу 0x61 будем хранить значение KeyInfo = 0x4000 (не 0xC000, чтоб не возникло коллизии с Applications (E0 5D)), и, следуя новому правилу, получим: (1D & 0x7F) | ((KeyInfo >> 8) & 0xC0) == 0x5D. Но, поскольку код Pause состоит из трёх байт, то по этому индексу тоже должен быть какой-то модификатор – и о благо: если взять 0x8000, то никаких коллизий не возникнет, и по индексу 0xC5 будет находиться виртуальный код Pause.

ПРИМЕЧАНИЕ

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

Таблица трансляции:


KeyIndex (HEX)Virtual KeyAttributeComment
00VK_UNKNOWN
Esc01VK_ESCAPE
102VK_1
203VK_2
304VK_3
405VK_4
506VK_5
607VK_6
708VK_7
809VK_8
90AVK_9
00BVK_0
0CVK_OEM_MINUS
=0DVK_OEM_PLUS
Back Space0EVK_BACK
Tab0FVK_TAB
Q10VK_Q
W11VK_W
E12VK_E
R13VK_R
T14VK_T
Y15VK_Y
U16VK_U
I17VK_I
O18VK_O
P19VK_P
[1AVK_OEM_4
]1BVK_OEM_6
Enter1CVK_RETURN
Ctrl Left1DVK_CONTROL
A1EVK_A
S1FVK_S
D20VK_D
F21VK_F
G22VK_G
H23VK_H
J24VK_J
K25VK_K
L26VK_L
;27VK_OEM_1
«28VK_OEM_7
29VK_OEM_3
Shift Left2AVK_SHIFT
\2BVK_OEM_5
Z2CVK_Z
X2DVK_X
C2EVK_C
V2FVK_V
B30VK_B
N31VK_N
M32VK_M
34VK_OEM_PERIOD
?35VK_OEM_2
Shift Right36VK_SHIFTRIGHT
Num Multiply37VK_MULTIPLY
Alt Left38VK_MENU
Space39VK_SPACE
Caps Lock3AVK_CAPITAL
F13BVK_F1
F23CVK_F2
F33DVK_F3
F43EVK_F4
F53FVK_F5
F640VK_F6
F741VK_F7
F842VK_F8
F943VK_F9
F1044VK_F10
Num Lock45VK_NUMLOCK
Scroll Lock46VK_SCROLL
Num 747VK_NUMPAD7
Num 848VK_NUMPAD8
Num 949VK_NUMPAD9
Num Minus4AVK_SUBTRACT
Num 44BVK_NUMPAD4
Num 54CVK_NUMPAD5
Num 64DVK_NUMPAD6
Num Plus4EVK_ADD
Num 14FVK_NUMPAD1
Num 250VK_NUMPAD2
Num 351VK_NUMPAD3
Num 052VK_NUMPAD0
Num Dot53VK_DECIMAL
54VK_UNKNOWN
55VK_UNKNOWN
56VK_UNKNOWN
F1157VK_F11
F1258VK_F12
59VK_UNKNOWN
5AVK_UNKNOWN
5BVK_UNKNOWN
5CVK_UNKNOWN
5DEXTENDPause (E1 1D)
5EVK_UNKNOWN
5FVK_UNKNOWN
60EXTENDExtended (E0)
61PAUSE_EXTENDPause (E1)
62VK_UNKNOWN
63VK_UNKNOWN
64VK_UNKNOWN
65VK_UNKNOWN
66VK_UNKNOWN
67VK_UNKNOWN
68VK_UNKNOWN
69VK_UNKNOWN
6AVK_UNKNOWN
6BVK_UNKNOWN
6CVK_UNKNOWN
6DVK_UNKNOWN
6EVK_UNKNOWN
6FVK_UNKNOWN
70VK_UNKNOWN
71VK_UNKNOWN
72VK_UNKNOWN
73VK_UNKNOWN
74VK_UNKNOWN
75VK_UNKNOWN
76VK_UNKNOWN
77VK_UNKNOWN
78VK_UNKNOWN
79VK_UNKNOWN
7AAcknowledge (FA)
7BVK_UNKNOWN
7CVK_UNKNOWN
7DVK_UNKNOWN
7EVK_UNKNOWN
7FVK_UNKNOWN
80VK_UNKNOWN
81VK_UNKNOWN
82VK_UNKNOWN
83VK_UNKNOWN
84VK_UNKNOWN
85VK_UNKNOWN
86VK_UNKNOWN
87VK_UNKNOWN
88VK_UNKNOWN
89VK_UNKNOWN
8AVK_UNKNOWN
8BVK_UNKNOWN
8CVK_UNKNOWN
8DVK_UNKNOWN
8EVK_UNKNOWN
8FVK_UNKNOWN
90VK_UNKNOWN
91VK_UNKNOWN
92VK_UNKNOWN
93VK_UNKNOWN
94VK_UNKNOWN
95VK_UNKNOWN
96VK_UNKNOWN
97VK_UNKNOWN
98VK_UNKNOWN
99VK_UNKNOWN
9AVK_UNKNOWN
9BVK_UNKNOWN
Num Enter9CVK_RETURNRIGHT
Ctrl Right9DVK_CONTROLRIGHT
9EVK_UNKNOWN
9FVK_UNKNOWN
A0VK_UNKNOWN
A1VK_UNKNOWN
A2VK_UNKNOWN
A3VK_UNKNOWN
A4VK_UNKNOWN
A5VK_UNKNOWN
A6VK_UNKNOWN
A7VK_UNKNOWN
A8VK_UNKNOWN
A9VK_UNKNOWN
AAAdditional (E0 2A)
ABVK_UNKNOWN
ACVK_UNKNOWN
ADVK_UNKNOWN
AEVK_UNKNOWN
AFVK_UNKNOWN
B0VK_UNKNOWN
B1VK_UNKNOWN
B2VK_UNKNOWN
B3VK_UNKNOWN
B4VK_UNKNOWN
Num DivideB5VK_DIVIDE
B6VK_UNKNOWN
Print ScreenB7VK_SNAPSHOT
Alt RightB8VK_MENURIGHT
B9VK_UNKNOWN
BAVK_UNKNOWN
BBVK_UNKNOWN
BCVK_UNKNOWN
BDVK_UNKNOWN
BEVK_UNKNOWN
BFVK_UNKNOWN
C0VK_UNKNOWN
C1VK_UNKNOWN
C2VK_UNKNOWN
C3VK_UNKNOWN
C4VK_UNKNOWN
PauseC5VK_PAUSE
C6VK_UNKNOWN
HomeC7VK_HOME
Arrow UpC8VK_UP
Page UpC9VK_PRIOR
CAVK_UNKNOWN
Arrow LeftCBVK_LEFT
CCVK_UNKNOWN
Arrow RightCDVK_RIGHT
CEVK_UNKNOWN
EndCFVK_END
Arrow DownD0VK_DOWN
Page DownD1VK_NEXT
InsertD2VK_INSERT
DeleteD3VK_DELETE
D4VK_UNKNOWN
D5VK_UNKNOWN
D6VK_UNKNOWN
D7VK_UNKNOWN
D8VK_UNKNOWN
D9VK_UNKNOWN
DAVK_UNKNOWN
Win LeftDBVK_WIN
Win RightDCVK_WINRIGHT
ApplicationsDDVK_APPS
PowerDEVK_POWER
SleepDFVK_SLEEP
E0VK_UNKNOWN
E1VK_UNKNOWN
E2VK_UNKNOWN
Wake UpE3VK_WAKEUP
E4VK_UNKNOWN
E5VK_UNKNOWN
E6VK_UNKNOWN
E7VK_UNKNOWN
E8VK_UNKNOWN
E9VK_UNKNOWN
EAVK_UNKNOWN
EBVK_UNKNOWN
ECVK_UNKNOWN
EDVK_UNKNOWN
EEVK_UNKNOWN
EFVK_UNKNOWN
F0VK_UNKNOWN
F1VK_UNKNOWN
F2VK_UNKNOWN
F3VK_UNKNOWN
F4VK_UNKNOWN
F5VK_UNKNOWN
F6VK_UNKNOWN
F7VK_UNKNOWN
F8VK_UNKNOWN
F9VK_UNKNOWN
FAVK_UNKNOWN
FBVK_UNKNOWN
FCVK_UNKNOWN
FDVK_UNKNOWN
FEVK_UNKNOWN
FFVK_UNKNOWN
ПРЕДУПРЕЖДЕНИЕ

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

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

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

Добавить комментарий

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

СОВЕТ

Определения самих таблиц вынесены в отдельные файлы (TrnslTbl.inc, NamesTbl.inc) в которых присутствуют только сами объявления, вследствие чего упрощается их модификация, например, если нам понадобится изменить значение кода 0xFE, то мы просто перейдём на строку 255 и сделаем необходимые изменения.

P. S. Конструктивная критика, исправления и дополнения крайне приветствуются.

Источник