Скан-код — Википедия
Материал из Википедии — свободной энциклопедии
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 5 ноября 2015; проверки требуют 23 правки. Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 5 ноября 2015; проверки требуют 23 правки.Скан-код (англ. scan code) — в IBM-совместимых компьютерах код, присвоенный каждой клавише, с помощью которого драйвер клавиатуры распознает, какая клавиша была нажата. При нажатии любой клавиши контроллер клавиатуры распознаёт клавишу и посылает её скан-код в порт 60h. При отпускании клавиши контроллер клавиатуры устаревшего формата IBM PC/XT посылает в тот же порт скан-код, увеличенный на 80h, а более нового формата IBM PC/AT — два байта: F0h и скан-код (скан-коды клавиатуры AT также отличаются от XT, см. таблицу). Некоторые клавиши генерируют не один, а несколько скан-кодов (так, правые
Скан-коды жёстко привязаны к каждой клавише на аппаратном уровне и не зависят ни от состояния индикаторов ⇪ Caps Lock, Num Lock и Scroll Lock, ни от состояния управляющих клавиш (⇧ Shift, Alt, Ctrl).
Все скан-коды ниже даются в шестнадцатеричной системе.
Большинство скан-кодов на XT-клавиатуре соответствуют физическому местоположению клавиш, начиная с клавиш Esc (код 01) и цифровых клавиш 1-9 (коды 02-0A). К примеру, клавиши второго ряда ( Tab ↹ Q W E R T Y U I O P [ ] ↵ Enter) имеют последовательные скан-коды 0F-1C (15-28 в десятичной системе).
На клавиатурах другой раскладки (например, AZERTY) скан-коды соответствуют расположению клавиш: так, у французского A скан-код как у американского Q. Преобразованием скан-кодов в коды нажатых клавиш занимается ОС или BIOS.
Во всех операционных системах фирмы Microsoft, скан коды из набора 2 (AT) преобразуются в скан коды набора 1 (XT), и все приложения получают уже скан коды набора 1.[1]
Клавиша | Код нажатия XT | Код отпускания XT | Код нажатия AT | Код отпускания AT |
---|---|---|---|---|
Основная клавиатура | ||||
A | 1E | 9E | 1C | F0,1C |
B | 30 | B0 | 32 | F0,32 |
C | 2E | AE | 21 | F0,21 |
D | 20 | A0 | 23 | F0,23 |
E | 12 | 92 | 24 | F0,24 |
F | 21 | A1 | 2B | F0,2B |
G | 22 | A2 | 34 | F0,34 |
H | 23 | A3 | 33 | F0,33 |
I | 17 | 97 | 43 | F0,43 |
J | 24 | A4 | 3B | F0,3B |
K | 25 | A5 | 42 | F0,42 |
L | 26 | A6 | 4B | F0,4B |
M | 32 | B2 | 3A | F0,3A |
N | 31 | B1 | 31 | F0,31 |
O | 18 | 98 | 44 | F0,44 |
P | 19 | 99 | 4D | F0,4D |
Q | 10 | 90 | 15 | F0,15 |
R | 13 | 93 | 2D | F0,2D |
S | 1F | 9F | 1B | F0,1B |
T | 14 | 94 | 2C | F0,2C |
U | 16 | 96 | 3C | F0,3C |
V | 2F | AF | 2A | F0,2A |
W | 11 | 91 | 1D | F0,1D |
X | 2D | AD | 22 | F0,22 |
Y | 15 | 95 | 35 | F0,35 |
Z | 2C | AC | F0,1A | |
0 | 0B | 8B | 45 | F0,45 |
1 | 02 | 82 | 16 | F0,16 |
2 | 03 | 83 | 1E | F0,1E |
3 | 04 | 84 | 26 | F0,26 |
4 | 05 | 85 | 25 | F0,25 |
5 | 06 | 86 | 2E | F0,2E |
6 | 07 | 87 | 36 | F0,36 |
7 | 08 | 88 | 3D | F0,3D |
8 | 09 | 89 | 3E | F0,3E |
9 | 0A | 8A | 46 | F0,46 |
~ | 29 | 89 | 0E | F0,0E |
- | 0C | 8C | 4E | F0,4E |
= | 0D | 82 | 55 | F0,55 |
\ | 2B | AB | 5D | F0,5D |
[ | 1A | 9A | 54 | F0,54 |
] | 1B | 9B | 5B | F0,5B |
; | 27 | A7 | 4C | F0,4C |
' | 28 | A8 | 52 | F0,52 |
, | 33 | B3 | 41 | F0,41 |
. | 34 | B4 | 49 | F0,49 |
/ | 35 | B5 | 4A | F0,4A |
BS | 0E | 8E | 66 | F0,66 |
Space | 39 | B9 | 29 | F0,29 |
Tab ↹ | 0F | 8F | 0D | F0,0D |
⇪ Caps Lock | 3A | BA | 58 | F0,58 |
Левый ⇧ Shift | 2A | AA | 12 | F0,12 |
Левый Ctrl | 1D | 9D | 14 | F0,14 |
Левый Alt | 38 | B8 | 11 | F0,11 |
Левый ⊞ Win | E0,5B | E0,DB | E0,1F | E0,F0,1F |
Правый ⇧ Shift | 36 | B6 | 59 | F0,59 |
Правый Ctrl | E0,1D | E0,9D | E0,14 | E0,F0,14 |
Правый Alt | E0,38 | E0,B8 | E0,11 | E0,F0,11 |
Правый ⊞ Win | E0,5C | E0,DC | E0,27 | E0,F0,27 |
≣ Menu | E0,5D | E0,DD | E0,2F | E0,F0,2F |
↵ Enter | 1C | 9C | 5A | F0,5A |
Esc | 01 | 81 | 76 | F0,76 |
F1 | 3B | BB | 05 | F0,05 |
F2 | 3C | BC | 06 | F0,06 |
F3 | 3D | BD | 04 | F0,04 |
F4 | 3E | BE | 0C | F0,0C |
F5 | 3F | BF | 03 | F0,03 |
F6 | 40 | C0 | 0B | F0,0B |
F7 | 41 | C1 | 83 | F0,83 |
F8 | 42 | C2 | 0A | F0,0A |
F9 | 43 | C3 | 01 | F0,01 |
F10 | 44 | C4 | 09 | F0,09 |
57 | D7 | 78 | F0,78 | |
F12 | 58 | D8 | 07 | F0,07 |
PrtScr | E0,2A,E0,37 | E0,B7,E0,AA | E0,12,E0,7C | E0,F0,7C,E0,F0,12 |
Alt+PrtScr | 54 (вместо PrtScr, код для клавиши Alt генерируется отдельно) | D4 (вместо PrtScr, код для клавиши Alt генерируется отдельно) | ? | ? |
Ctrl+PrtScr, ⇧ Shift+PrtScr (SysReq) | E0,37 (вместо PrtScr, код для Ctrl или ⇧ Shift генерируется отдельно) | E0,B7 (вместо PrtScr, код для Ctrl или ⇧ Shift генерируется отдельно) | ? | ? |
Scroll Lock | 46 | C6 | 7E | F0,7E |
Pause | E1,1D,45, E1,9D,C5 | — | E1,14,77, E1,F0,14,F0,77 | — |
Ctrl+Break (Ctrl+Pause) | E0,46 (вместо Break, код для клавиши Ctrl генерируется отдельно) | E0,C6 (вместо Break, код для клавиши Ctrl генерируется отдельно) | ? | ? |
Insert | E0,52 | E0,D2 | E0,70 | E0,F0,70 |
Home | E0,47 | E0,C7 | E0,6C | E0,F0,6C |
End | E0,4F | E0,CF | E0,69 | E0,F0,69 |
Page Up | E0,49 | E0,C9 | E0,7D | E0,F0,7D |
Page Down | E0,51 | E0,D1 | E0,7A | E0,F0,7A |
Delete | E0,53 | E0,D3 | E0,71 | E0,F0,71 |
↑ | E0,48 | E0,C8 | E0,75 | E0,F0,75 |
← | E0,4B | E0,CB | E0,6B | E0,F0,6B |
↓ | E0,50 | E0,D0 | E0,72 | E0,F0,72 |
→ | E0,4D | E0,CD | E0,74 | E0,F0,74 |
Цифровая клавиатура | ||||
Num Lock | 45 | C5 | 77 | F0,77 |
/ | E0,35 | E0,B5 | E0,4A | E0,F0,4A |
* | 37 | B7 | 7C | F0,7C |
- | 4A | CA | 7B | F0,7B |
+ | 4E | CE | 79 | F0,79 |
↵ Enter | E0,1C | E0,9C | E0,5A | E0,F0,5A |
. | 53 | D3 | 71 | F0,71 |
0 | 52 | D2 | 70 | F0,70 |
1 | 4F | CF | 69 | F0,69 |
2 | 50 | D0 | 72 | F0,72 |
ru.wikipedia.org
Ремаппинг клавиш на клавиатуре / Habr
Всю свою жизнь был фанатом бесшумных, тонких, и красивых клавиатур и к моему удивлению обнаружил что таковых не так уж и много, из доступных в свободной продаже, — их единицы. Пришлось пользоваться «Genius SlimStar Pro», и все равно она меня угнетала, как и мысль о том, что я никогда не найду клавиатуру которая бы удовлетворяла меня на все 100%. Я такую нашел и по рекомендации товарища Boomburum, приобрел “Illuminated Keyboard“, которая стала достойной подругой моей “MX Revolution“, и я окончательно порвал отношения с Genius, а последние рассказы о поддержке пользователей со стороны Logitech, убедили меня, что вложенные (не малые деньги) себя оправдают за 3 гарантийных года.
Но есть небольшая беда в клавиатурах этой компании, — “Не стандартные, не удобные, или не нужные расположения некоторых кнопок“. В случае с Illuminated, это две одинаковые кнопки “\”, левая из которых пошла в ущерб клавише «LShift», Кстати на картинке вы можете заметить что раньше эти клавиатуры имели стандартный размер «LShift». Под катом, я расскажу как вернуть «стандартную длину» этой кнопки, так как в слепой печати и в силу привычки, я нажимаю именно / вместо шифта. А заодно расскажу как без дополнительного установленного ПО, на примере, вы сможете менять назначения любых клавиш ваших клавиатур (в том числе и функциональных/медийных) при помощи Реестра и Скан-кода клавиш.
Спецификация для Windows.
При нажатии любой клавиши контроллер клавиатуры вырабатывает скан-код, соответствующей позиции клавиши, который передаются в компьютер. Служебные коды, которые может вырабатывать контроллер клавиатуры, передаются для обработки подпрограммам BIOS. В буфере клавиатуры для кода клавиши отводится по 2 байта, т. е. он рассчитан на 16 символов.
Узнать Скан-код необходимой для ремаппинга клавиши вы можете здесь, а если у вас супер новая клавиатура с кнопками космического происхождения, то отловить скан-код вы можете используя программу “KeyboardTest” от разработчика Passmark Software. Программка платная, но бесплатным триалом. Или OpenSource Программу SharpKeys. Она потребовалась для определения скан-кода левой “\”, так как многие наивно полагали что сигналы у обеих одинаковые, а значит и не подлежат ремаппингу. На деле оказалось не так.
Правый “\” имеет скан-код: 2b.00
Левый нижний “\” имеет скан-код: 56.00
И так, мы определили скан-код нашей незадачливой кнопки, теперь нам нужно найти скан-код «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:
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
habr.com
код – это… Что такое Скан-код?
Скан-код — код, присвоенный каждой клавише, с помощью которого драйвер клавиатуры распознает, какая клавиша была нажата. При нажатии любой клавиши контроллер клавиатуры распознаёт клавишу и посылает её скан-код в порт 60h. При отпускании клавиши контроллер клавиатуры устаревшего формата IBM PC/XT посылает в тот же порт скан-код, увеличенный на 80h, а более нового формата IBM PC/AT — два байта: F0h и скан-код (скан-коды клавиатуры AT также отличаются от XT, см. таблицу). Некоторые клавиши генерируют не один, а несколько скан-кодов (так, правые ⇧ Shift , Alt , Ctrl , обе Win , а также Menu , Insert , Delete , Page Up , Page Down , Home , End , стрелки и все ACPI- и мультимедиа-клавиши генерируют два скан-кода, первый из которых — E0, клавиша PrtScr генерирует 4 скан-кода, а клавиша Pause — целых 6 скан-кодов). Каждый байт, записанный в порт 60h, генерирует аппаратное прерывание int 09h.
Скан-коды жёстко привязаны к каждой клавише на аппаратном уровне и не зависят ни от состояния индикаторов Caps Lock , Num Lock и Scroll Lock , ни от состояния управляющих клавиш ( ⇧ Shift , Alt , Ctrl ).
Скан-коды клавиш
Все скан-коды ниже даются в шестнадцатеричной системе.
Большинство скан-кодов на XT-клавиатуре соответствуют физическому местоположению клавиш, начиная с клавиш Esc (код 01) и цифровых клавиш 1-9 (коды 02-09). К примеру, клавиши второго ряда ( Tab ⇆ Q W E R T Y U I O P [ ] ↵ Enter ) имеют последовательные скан-коды 0F-1C (15-28 в десятичной системе).
Клавиша | Код нажатия XT | Код отпускания XT | Код нажатия AT | Код отпускания AT |
---|---|---|---|---|
Основная клавиатура | ||||
A | 1E | 9E | 1C | F0,1C |
B | 30 | B0 | 32 | F0,32 |
C | 2E | AE | 21 | F0,21 |
D | 20 | A0 | 23 | F0,23 |
E | 12 | 92 | 24 | F0,24 |
F | 21 | A1 | 2B | F0,2B |
G | 22 | A2 | 34 | F0,34 |
H | 23 | A3 | 33 | F0,33 |
I | 17 | 97 | 43 | F0,43 |
J | 24 | A4 | 3B | F0,3B |
K | 25 | A5 | 42 | F0,42 |
L | 26 | A6 | 4B | F0,4B |
M | 32 | B2 | 3A | F0,3A |
N | 31 | B1 | 31 | F0,31 |
O | 18 | 98 | 44 | F0,44 |
P | 19 | 99 | 4D | F0,4D |
Q | 10 | 90 | 15 | F0,15 |
R | 13 | 93 | 2D | F0,2D |
S | 1F | 9F | 1B | F0,1B |
T | 14 | 94 | 2C | F0,2C |
U | 16 | 96 | 3C | F0,3C |
V | 2F | AF | 2A | F0,2A |
W | 11 | 91 | 1D | F0,1D |
X | 2D | AD | 22 | F0,22 |
Y | 15 | 95 | 35 | F0,35 |
Z | 2C | AC | 1A | F0,1A |
0 | 0B | 8B | 45 | F0,45 |
1 | 02 | 82 | 16 | F0,16 |
2 | 03 | 83 | 1E | F0,1E |
3 | 04 | 84 | 26 | F0,26 |
4 | 05 | 85 | 25 | F0,25 |
5 | 06 | 86 | 2E | F0,2E |
6 | 07 | 87 | 36 | F0,36 |
7 | 08 | 88 | 3D | F0,3D |
8 | 09 | 89 | 3E | F0,3E |
9 | 0A | 8A | 46 | F0,46 |
~ | 29 | 89 | 0E | F0,0E |
- | 0C | 8C | 4E | F0,4E |
= | 0D | 82 | 55 | F0,55 |
\ | 2B | AB | 5D | F0,5D |
[ | 1A | 9A | 54 | F0,54 |
] | 1B | 9B | 5B | F0,5B |
; | 27 | A7 | 4C | F0,4C |
' | 28 | A8 | 52 | F0,52 |
, | 33 | B3 | 41 | F0,41 |
. | 34 | B4 | 49 | F0,49 |
/ | 35 | B5 | 4A | F0,4A |
← Backspace | 0E | 8E | 66 | F0,66 |
Space | 39 | B9 | 29 | F0,29 |
Tab ⇆ | 0F | 8F | 0D | F0,0D |
Caps Lock | 3A | BA | 58 | F0,58 |
Левый ⇧ Shift | 2A | AA | 12 | F0,12 |
Левый Ctrl | 1D | 9D | 14 | F0,14 |
Левый Alt | 38 | B8 | 11 | F0,11 |
Левый Win | E0,5B | E0,DB | E0,1F | E0,F0,1F |
Правый ⇧ Shift | 36 | B6 | 59 | F0,59 |
Правый Ctrl | E0,1D | E0,9D | E0,14 | E0,F0,14 |
Правый Alt | E0,38 | E0,B8 | E0,11 | E0,F0,11 |
Правый Win | E0,5C | E0,DC | E0,27 | E0,F0,27 |
Menu | E0,5D | E0,DD | E0,2F | E0,F0,2F |
↵ Enter | 1C | 9C | 5A | F0,5A |
Esc | 01 | 81 | 76 | F0,76 |
F1 | 3B | BB | 05 | F0,05 |
F2 | 3C | BC | 06 | F0,06 |
F3 | 3D | BD | 04 | F0,04 |
F4 | 3E | BE | 0C | F0,0C |
F5 | 3F | BF | 03 | F0,03 |
F6 | 40 | C0 | 0B | F0,0B |
F7 | 41 | C1 | 83 | F0,83 |
F8 | 42 | C2 | 0A | F0,0A |
F9 | 43 | C3 | 01 | F0,01 |
F10 | 44 | C4 | 09 | F0,09 |
F11 | 57 | D7 | 78 | F0,78 |
F12 | 58 | D8 | 07 | F0,07 |
PrtScr | E0,2A,E0,37 | E0,B7,E0,AA | E0,12,E0,7C | E0,F0,7C,E0,F0,12 |
Scroll Lock | 46 | C6 | 7E | F0,7E |
Pause | E1,1D,45, E1,9D,C5 | — | E1,14,77,E1,F0,14,F0,77 | — |
Insert | E0,52 | E0,D2 | E0,70 | E0,F0,70 |
Home | 47 | C1 | E0,6C | E0,F0,6C |
End | E0,4F | E0,CF | E0,69 | E0,F0,69 |
Page Up | E0,49 | E0,C9 | E0,7D | E0,F0,7D |
Page Down | E0,51 | E0,D3 | E0,7A | E0,F0,7A |
Delete | E0,53 | E0,D3 | E0,71 | E0,F0,71 |
↑ | E0,48 | E0,C8 | E0,75 | E0,F0,75 |
← | E0,4B | E0,CB | E0,6B | E0,F0,6B |
↓ | E0,50 | 50,D0 | E0,70 | E0,F0,70 |
→ | E0,4D | E0,CD | E0,74 | E0,F0,74 |
Цифровая клавиатура | ||||
Num Lock | 45 | C5 | 77 | F0,77 |
/ | E0,35 | E0,B5 | E0,4A | E0,F0,4A |
* | 37 | B7 | 7C | F0,7C |
- | 4A | CA | 7B | F0,7B |
+ | 4E | CE | 79 | F0,79 |
↵ Enter | E0,1C | E0,9C | E0,5A | E0,F0,5A |
. | 53 | D3 | 71 | F0,71 |
0 | 52 | D2 | 70 | F0,70 |
1 | 4F | CF | 69 | F0,69 |
2 | 50 | D0 | 72 | F0,72 |
3 | 51 | D1 | 7A | F0,7A |
4 | 4B | CB | 6B | F0,6B |
5 | 4C | CC | 73 | F0,73 |
6 | 4D | CD | 74 | F0,74 |
7 | 47 | C7 | 6C | F0,6C |
8 | 48 | C8 | 75 | F0,75 |
9 | 49 | C9 | 7D | F0,7D |
Клавиши ACPI | ||||
Power | E0,5E | E0,DE | E0,37 | E0,F0,37 |
Sleep | E0,5F | E0,DF | E0,3F | E0,F0,3F |
Wake | E0,63 | E0,E3 | E0,5E | E0,F0,5E |
Мультимедиа клавиши | ||||
Управление проигрывателем | ||||
Следующий трек | E0,19 | E0, 99 | E0, 4D | E0,F0,4D |
Предыдущий трек | E0,10 | E0, 90 | E0,15 | E0,F0,15 |
Остановить | E0,24 | E0,A4 | E0,3B | E0,F0,3B |
Проигрывать/пауза | E0,22 | E0,A2 | E0,3B | E0,F0,3B |
Звук вкл/откл | E0,20 | E0,A0 | E0,23 | E0,F0,23 |
Увеличить громкость | E0,30 | E0,B0 | E0,32 | E0,F0,32 |
Уменьшить громкость | E0,2E | E0,AE | E0,21 | E0,F0,21 |
Управление браузером | ||||
Поиск | E0,65 | E0,E5 | E0,10 | E0,F0,10 |
Домашняя страница | E0,32 | E0,B2 | E0,3A | E0,F0,3A |
Назад | E0,6A | E0,EA | E0,38 | E0,F0,38 |
Вперед | E0,69 | E0,E9 | E0,30 | E0,F0,30 |
Стоп | E0,68 | E0, E8 | E0,28 | E0,F0,28 |
Обновить | E0,67 | E0,E7 | E0,F0,20 | E0,F0,20 |
Закладки | E0,66 | E0, E6 | E0,18 | E0,F0,18 |
Управление приложениями | ||||
Media Select | E0,6D | E0,ED | E0,50 | E0,F0,50 |
Электронная почта | E0,6C | E0,EC | E0,48 | E0,F0,48 |
Калькулятор | E0,21 | E0,A1 | E0,2B | E0,F0,2B |
Мой компьютер | E0,6B | E0,EB | E0,40 | E0,F0,40 |
Cм. также
Ссылки
dic.academic.ru
К вопросу оценки ПЭМИН цифровых сигналов. Клавиатуры.
К вопросу оценки ПЭМИН цифровых сигналов. Клавиатуры.
Автор: Кондратьев А.В.
Следующим типовым устройством ПЭВМ, вроде бы и несложным, но доставляющим, порою, хлопоты исследователю, является клавиатура.
В общем-то устройство несложное. Особенно ноне уже устаревшие модели, подключаемые к порту PS/2. Как показывают многочисленные экспериментальные данные микросхема управления «клавы» сканирует нажатия клавиш и передаёт в последовательном коде в порт. Тактовая частота этой передачи кратна (в подавляющем числе случаев) » 6,3 или 10 кГц. Хотя автору попались в самые последние года пара экземпляров, тактовая частота которых лежала в районе 20 кГц.
Все клавиатуры при нажатии и удерживании любой клавиши начинают (после некоторой паузы) повторять передачу кода клавиши «до бесконечности». В обычном режиме это, как правило, через несколько секунд приводит к переполнению буфера контроллера и нарушению работы. Появляется звуковой сигнал системного «динамика» – «писк». Суть тест-режима (самого общепринятого) заключается в блокировании команды переполнения буфера, что позволяет, при нажатой клавише, обеспечить бесконечную передачу по кабелю «клавы» выбранного символа.
Как и всегда, для правильного последующего расчёта результата, необходимо создать постоянное чередование импульсов в кодовом пакете. Для кодов клавиатуры таких комбинаций может существовать две:
10101010 (55) клавиша « +; = »
01010101 (АА) в типовых таблицах – не применяется
Общая таблица скан-кодов приведена в таблице 14.1
Таблица 14.1 – Скан-коды клавиатуры
Клавиша |
Скан-код |
Клавиша |
Скан-код |
Клавиша |
Скан-код |
Клавиша |
Скан-код |
---|---|---|---|---|---|---|---|
1 |
16 |
2 |
1E |
3 |
26 |
4 |
25 |
5 |
2E |
6 |
36 |
7 |
3D |
8 |
3E |
9 |
46 |
0 |
45 |
– |
4E |
+ |
55 |
Backspace |
66 |
Tab |
0D |
Q |
15 |
W |
1D |
E |
24 |
R |
2D |
T |
2C |
Y |
35 |
U |
3C |
I |
43 |
O |
44 |
P |
4d |
[ |
54 |
] |
5B |
Enter |
5A |
Ctrl(L) |
14 |
A |
1C |
S |
1B |
D |
23 |
F |
2B |
G |
34 |
H |
33 |
J |
3B |
K |
42 |
L |
4B |
; |
4C |
‘ |
52 |
` |
0E |
Shift(L) |
12 |
\ |
61 |
Z |
1A |
X |
22 |
C |
21 |
V |
2A |
B |
32 |
N |
31 |
M |
3A |
, |
41 |
. |
49 |
/ |
4A |
Shift(R) |
59 |
Alt(L) |
11 |
Space |
29 |
Caps Lock |
58 |
Esc |
76 |
F1 |
05 |
F2 |
06 |
F3 |
04 |
F4 |
0C |
F5 |
03 |
F6 |
0B |
F7 |
83 |
F8 |
0A |
F9 |
01 |
F10 |
09 |
F11 |
78 |
F12 |
07 |
Scroll Lock |
7E |
*[numpad] |
7C |
Num Lock |
77 |
7[numpad] |
6C |
8[numpad] |
75 |
9[numpad] |
7D |
-[numpad] |
7B |
4[numpad] |
6B |
5[numpad] |
73 |
6[numpad] |
74 |
+[numpad] |
5A |
1[numpad] |
69 |
2[numpad] |
72 |
3[numpad] |
7A |
0[numpad] |
70 |
.[numpad] |
71 |
Alr(R) |
E0-11 |
Ctrl(R) |
E0-14 |
Print Screen |
E0-12-E0-7C |
Insert |
E0-70 |
Delete |
E0-71 |
Left |
E0-6B |
Home |
E0-6C |
End |
E0-69 |
Up |
E0-75 |
Down |
E0-72 |
PageUp |
E0-7D |
PageDown |
E0-7A |
Right |
E0-74 |
Enter[numpad] |
E0-5A |
/[numpad] |
E0-4A |
Таким образом, при реализации тест-режима и, например, положенном на клавишу «+» грузике в кабеле «клавы» будет присутствовать бесконечная последовательность пакетов импульсов. При этом период следования импульсов в пакете (то есть тактовая частота), будет равна 6,10 или 20 кГц, а частота следования пакетов будет много ниже. Формат данных приведён на рисунке 14.1
Для обмена данными в кабеле клавиатуры служат две линии – KBData и KBSync. При передаче скан-кодов клавиатура выставляет очередной разряд данных на линии KBData и подтверждает передачу переводом из «1» в «0» сигнала на линии KBSync.
Контроллер может сигнализировать о своей неготовности передавать/принимать данные низким уровнем на линии KBSync. Все остальное время, когда нет данных для передачи, обе линии имеют высокий уровень сигнала.
Как следует из вышеприведённого, в спектре ПЭМИН кабеля клавиатуры следует ожидать частотных составляющих с тактовой частотой 1/76,04·10-6=13,15 кГц. Причём из-за наличия двух, сдвинутых по фазе, сигналов с разными (но кратными!) периодами, чётные и нечётные частотные составляющие будут отличаться по амплитуде.
Как и следует ожидать, ПЭМИН линии синхроданных неинформативен, в принципе. Но отличить один ПЭМИН от другого совсем непросто. Кабель один, сигналы синхронны…
Практически единственный способ – подобрать скан-код с минимальным числом логических «1» в посылке. Таковыми являются клавиши «F3» и F9» (03 и 01 в hex-коде). Код «00» не используется.
Осциллограмма скан-кода «F3» приведена ниже.
Строго «по энергетике», если измерить все частотные составляющие ПЭМИН с кодом «=» и, например, кодом «F9», то разность в показаниях приёмника на КАЖДОЙ из частотных составляющих и есть истинно информационная часть энергии ПЭМИН. Причём это максимум максиморум. Работа достаточно сложная и утомительная, если нет возможности поручить её «автомату». Сами-то составляющие ПЭМИН для столь низких частот выявляются не без труда. Так ещё и разности «ловить»…
В практике СИ, в подавляющем числе случаев, просто измеряют уровни ПЭМИН (ничего не вычитая) и считают параметр защищённости. Можно и так, «с запасом», но знать истинное положение дел специалист обязан.
В заключение рассмотрения – «распиновка» разъемов AT- и PS/2-клавиатуры.
«Картинки» на приёмнике выглядит далеко не так «классически», однако и он вполне узнаваем. Вот примеры
На спектре хорошо видно возрастание амплитуды компонент с уменьшением частоты.
Есть ещё особенности измерений «клавы» в этой частотной области (от десятков кГц и далее). Дело в том, что клавиатура, в обычном размещении, находится неподалеку от системного блока. А в верхней части СБ находится импульсный блок питания – мощнейший источник ПЭМИН и по «Е», и по «Н» компонентам. В «свете» такого театрального софита, тускловатый «свет» клавиатуры узреть – особое искусство! Поэтому предлагаю следующий приём. Отодвиньте «клаву» от СБ как можно дальше. Лучше – на удлинителе PS/2. Эдак метра на 2-2,5.
Разместите антенну так, чтобы на неё наводилось как можно меньше от СБ (сигнал, при полосе приёмника больше 10 кГц – сплошной спектр). И вот около так сориентированной, неподвижной антенны, начинайте крутить «клаву» и её кабель (не наоборот!). Тогда у Вас будет много больше шансов обнаружить сигналы ПЭМИН именно клавиатуры, увидеть компоненты ПЭМИН на экране анализатора воочую.
Всё вышеизложенное относилось к клавиатуре с интерфейсом PS/2. Но сейчас их массово заменяют клавиатуры с интерфейсом USB.
Вообще этот интерфейс достаточно подробно рассматривался совместно с принтерами. Однако будет нелишним дать некоторое «целеуказание» и относительно клавиатуры.
Вспомним построение пакетов для интерфейса USB, учитывая, что клавиатура подключается, строго, с low-speed (то есть, фактически по интерфейсу USB 1.0).
Максимальный размер полезной нагрузки DATA (payload) для low-speed устройств составляет 8 байт. То есть это, как раз, то, что требует скан-код клавиатуры.
Увидеть сигнал (именно данные) в линии USB оказалось не такой уж простой задачей. Тем не менее – вот что выявилось именно в кабеле типовой USB «клавы» модели GENIUS KB-06XE, конкретно в линии (проводе) «data +» (рисунок 14.10)
Эти две осциллограммы меняют друг друга с неустановленной (хаотической) периодичностью, причём «картинки» сигналов не зависят от нажатой клавиши клавиатуры (или ненажатой никакой). Никаких иных изменений в «переменной» части пакета (фрейма) выявить не удалось.
Периодичность следования этих пакетов жёстко стабилизирована (рис. 14.11), а длительность каждого составляет (видно на осциллограммах) около 34 ±1 мкс.
Пакеты следуют каждые 4 мс. Однако необходимо отметить, что окончание каждого пакета всё время «дрожит», причём заметно, классический «джиттер». Поэтому спектральная картинка несколько размыта и становится чёткой лишь при достаточно длительном усреднении.
Кроме того, следует учитывать, что из-за разных периодов следования импульсов и разной их длительности спектр носит характер некоторой смеси из спектра сплошного и линейчаатого. Тем не менее лепестковый характер спектра, естественный для бесконечной последовательности пакетов и кратный в своих «лепестках» средней длительности пакета, сохраняется весьма наглядно. Только «нули» функции сглажены джиттером и неременным периодом следования отдельных импульсов. Однако сама картинка вполне характерна. При более тонком частотном разрешении спектр начинает разрешаться на «линии», обусловленные частотой следования пакетов (250 Гц) (рис. 14.13)Таким образом, при простейшем и незасинхронизованном с истинной передачей скан-кода просмотре осциллограмм, выявить и визуализовать участки фрейма (пакета), отвечающий за передачу данных, не удалось. Тем не менее, можно утверждать, что ПЭМИН кабеля клавиатуры всё равно будет вот такой и никакой другой. Понятно, на каких частотах его искать, понятно, что он будет носить характер сплошного (во всяком случае, при частотном разрешении приёмника более 0,3 кГц). И понятно, какую величину подставлять при расчётах в качестве тактовой (минимальный период импульсов в пакете в эксперименте составил 1,322 мкс). Измерить это, при любых СИ, имея осциллограф, хотя бы с 200 МГц полосой – задача тривиальная. Тест-режим, по сути – любой, можно нажимать клавиши (любые), можно не нажимать ничего. Пакеты по интерфейсу передаются всё равно. И, в первом приближении, считаем их информативными (пока не доказано обратное).
Приведённые осциллограммы и спектры получены с помощью осциллографа АКИП-4108/2, подключённому к тому же компьютеру, на котором выполнялись измерения (надо заметить – весьма функциональный повтор разработки фирмы «PICO Technology» нашими. Не хуже китайцев 🙂 ) .
Спектр явно уходит далеко за 1 МГц (больше не позволил осциллограф, а подключать анализатор большого смысла не было). Остальное обусловлено уже кабелем, как случайной антенной и степенью его экранирования.
Для иных режимов интерфейса USB нужен уже осциллограф с полосою в многие ГГц.
Как именно считать сплошной спектр и, при этом, остаться в рамках действующих НМД – разговор отдельный и не для открытого обсуждения, увы… Однако в последующих публикациях придётся к нему вернуться, деваться некуда. Попытаюсь «остаться в рамках дозволенного»…
www.mascom.ru
Работа с клавиатурой. Читаем виртуальные и скан-коды клавиш. — Delphi в Internet
В начале, как полагается, разберемся с вопросом: зачем нам нужны виртуальные и скан-коды клавиш?
Лично для меня изучить этот вопрос сподвигла небольшая проблема при тестировании одной из программ в отделе экологов. Дело в том, что встречается такой тип людей, которые почему-то страх как боятся компьютеров, несмотря на то, что без них не могут обойтись, да к тому же не могут толком объяснить, в случае проблемы, что собственно случилось.
Начинаешь тестировать программу, устанавливаешь на компьютер пользователя, объясняешь все популярно (тот, естественно, что-то помечает на обрывках бумажек), спрашиваешь «Понял?», тот — «Да, понял.» Уходишь, через день приходишь и начинается «Программа не работает», «Там что-то какое-то окошко появилось» и т.д. и т.п. Спрашиваешь «Что делал?» Показывает действие за действием — ошибок нет…Как работал человек? Не понятно. Сидеть целый день за спиной у него и наблюдать — не вариант. Заставлять записывать за собой всё, что делал — изуверство. Интерфейс упростил дальше некуда, даже не Hint’ы сделал, а в тупую подписи под каждым контролом, что куда писать. Не помогло. В итоге, родилась простая, на первый взгляд идея — установить на компьютер пользователя небольшую программку-шпиона, чтобы отслеживала все действия, которые тот творит над программой. Естественно, предупредив перед этим работника, что теперь все его действия над программой сохраняются (только не сказал куда…мало ли). Вот в процессе работы над моим псевдо-шпионом мне и потребовались дополнительные знания по работе с клавиатурой.
Вы же можете использовать полученные знания где угодно:
- создавать клавиатурных шпионов (только учтите, что тот же «Касперский» их распознает очень хорошо)
- использовать коды в своих программах, например, если Вам захочется, чтобы программа выполняла какое-либо действие после нажатия на дополнительную клавишу, такую как F13 на навороченных клавиатурах и пр.
- разрабатывать приложения типа Punto Switcher и пр.
Сразу оговорюсь — в этой статье я не буду выкладывать весь исходник моего «шпиона», только ту часть, которая отвечает за перехват нажатия клавиши. Это связано с тем, что для полноценной работы моей программы мне также пришлось разобраться немного с Windows API, чтобы отслеживать действия только с моей программой, а это уже целая отдельная статья.
Теперь непосредственно по скан-кодам. В буфере клавиатуры отводится два байта на каждый символ (весь размер буфера — 32 байта, то есть 16 нажатий клавиш) — один байт представляет собой скан-код, второй — символьный код (для управляющих клавиш он равен нулю). В числом виде скан-коды требуются на практике очень редко, но чтобы их узнать, можно воспользоваться небольшой программкой на Pascal’е:
uses crt,dos; var xah, xal:byte; begin asm mov ah,10h {функция чтения из клавиатуры} int 16h mov xah, ah mov xal, al end; writeln('Symbol = ', xal, ' Scan = ', xah); end.
То есть после нажатия какой-нибудь клавиши в регистре al окажется код символа, а в ah — скан код.
Теперь про виртуальные коды.
Виртуальные коды — это то, что использует система для идентификации клавиш. То есть, зная виртуальный код клавиши, можно со 100% уверенностью хоть через неделю сказать пользователю, что он такого нажимал (и в какой последовательности). Дополнительно, зная текущую раскладку, можно также определить, что писал пользователь, но это уже немного другой вопрос.
Теперь напишем небольшую ловушку для клавиатуры, которая будет отлавливать все нажатия клавиш и писать лог-файл, в котором будет содержаться скан-код и виртуальный код нажатой клавиши.
library Spyhook; uses Messages, Windows, Ariphm; var HookHandle: HHOOK; ft: TextFile; function KeyboardProc(Code:Integer;wParam: wParam; LParam:LParam):integer; stdcall; begin if code<0 then Result:=CallNextHookEx(HookHandle, code, WParam, LParam) else if byte(LParam shr 24)<$80 then begin try append(ft); except exit; end; writeln(ft, 'Key(wParam)=$',hexw(wParam),' LParam =$',hexlong(lParam)); closefile(ft); end; CallNextHookEx(HookHandle, code, WParam, LParam) end; procedure SetHook; stdcall; begin HookHandle:=SetWindowsHookEx(WH_KEYBOARD, KeyboardProc,HInstance,0); end; procedure DelHook; stdcall; begin UnhookWindowsHookEx(HookHandle); end; exports SetHook, DelHook; begin AssignFile(ft, 'c:\keyhook.txt'); end.
Собственно, опытный глаз программиста сразу может увидеть недостаток, а именно — работа с файлом из DLL, что не рекомендуется. В идеале в DLL следует только определять коды и отсылать и в основную программу, а та в свою очередь пусть пишет их файл, но, как показала практика, может сгодиться и такой вариант.
Обратите внимание на выражение
byte(LParam shr 24)<$80
здесь определяется была ли нажата клавиша. Если да, то записываем файл. Если это условие убрать, то каждое действие на клавиатуре будет дублироваться, т.е. в файл запишется нажатая клавиша и отпущенная.
Теперь пишем основное приложение. Для демонстрации действия ловушки я сделал вот такую форму:
В верхний Memo записываем какой-либо текст, а в нижнем, по действию таймера, выписывается содержимое лог-файла. Таким образом Вы сможете практически «на лету» видеть, что происходит, какие данные передаются, что нажимается, какой параметр изменяется и т.д. и т.п.
Кстати, советую поставить по-больше задержку на таймере, иначе не будете успевать просмотреть всё содержимое.
Теперь делаем ссылки на необходимые нам процедуры из DLL. Будем загружать все необходимые процедуры (а их аж 2 штуки) сразу же после запуска программы. После описания формы пишем:
.... procedure SetHook; stdcall; External 'Spyhook.dll'; procedure DelHook; stdcall; External 'Spyhook.dll'; ....
На событие onCreate необходимо открыть или создать лог-файл и запустить нашу ловушку.
procedure TForm1.FormCreate(Sender: TObject); var ft: TextFile; begin AssignFile(ft, 'c:\keyhook.txt'); try reset(ft); except rewrite(ft); end; CloseFile(ft); SetHook; //запуск ловушки end;
Соответственно, на закрытие приложения ловушку необходимо выгрузить:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DelHook; end;
Вывод содержимого лог-файла в Memo делается проще простого:
procedure TForm1.Timer1Timer(Sender: TObject); begin Memo2.Clear; Memo2.Lines.LoadFromFile('c:\keyhook.txt'); end;
Вот и все, что от нас требовалось. Теперь запускаем приложение (предварительно положив рядом с ним созданную DLL) и любуемся результатом:
Как видите в wParam мы получаем необходимый виртуальный код, а в LParam — скан-код и дополнительные сведения, например, признак расширенной клавиши. Все данные сохраняются в HEX-форме и при желании вы их сможете легко расшифровать. Если возникнут трудности — обращайтесь, разберемся вместе.
webdelphi.ru
Коды клавиш клавиатуры Википедия
Скан-код (англ. scan code) — в IBM-совместимых компьютерах код, присвоенный каждой клавише, с помощью которого драйвер клавиатуры распознает, какая клавиша была нажата. При нажатии любой клавиши контроллер клавиатуры распознаёт клавишу и посылает её скан-код в порт 60h. При отпускании клавиши контроллер клавиатуры устаревшего формата IBM PC/XT посылает в тот же порт скан-код, увеличенный на 80h, а более нового формата IBM PC/AT — два байта: F0h и скан-код (скан-коды клавиатуры AT также отличаются от XT, см. таблицу). Некоторые клавиши генерируют не один, а несколько скан-кодов (так, правые Alt, Ctrl, ↵ Enter, обе ⊞ Win, а также ≣ Menu, Insert, Delete, Page Up, Page Down, Home, End, стрелки и все ACPI- и мультимедиа-клавиши генерируют два скан-кода, первый из которых — E0, клавиша PrtScr генерирует 4 скан-кода, а клавиша Pause — даже 6 скан-кодов). Каждый байт, записанный в порт 60h, генерирует аппаратное прерывание int 09h.
Скан-коды жёстко привязаны к каждой клавише на аппаратном уровне и не зависят ни от состояния индикаторов ⇪ Caps Lock, Num Lock и Scroll Lock, ни от состояния управляющих клавиш (⇧ Shift, Alt, Ctrl).
Скан-коды клавиш
Все скан-коды ниже даются в шестнадцатеричной системе.
Большинство скан-кодов на XT-клавиатуре соответствуют физическому местоположению клавиш, начиная с клавиш Esc (код 01) и цифровых клавиш 1-9 (коды 02-0A). К примеру, клавиши второго ряда (Tab ↹ Q W E R T Y U I O P [ ] ↵ Enter) имеют последовательные скан-коды 0F-1C (15-28 в десятичной системе).
На клавиатурах другой раскладки (например, AZERTY) скан-коды соответствуют расположению клавиш: так, у французского A скан-код как у американского Q. Преобразованием скан-кодов в коды нажатых клавиш занимается ОС или BIOS.
Во всех операционных системах фирмы Microsoft, скан коды из набора 2 (AT) преобразуются в скан коды набора 1 (XT), и все приложения получают уже скан коды набора 1.[1]
Клавиша | Код нажатия XT | Код отпускания XT | Код нажатия AT | Код отпускания AT |
---|---|---|---|---|
Основная клавиатура | ||||
A | 1E | 9E | 1C | F0,1C |
B | 30 | B0 | 32 | F0,32 |
C | 2E | AE | 21 | F0,21 |
D | 20 | A0 | 23 | F0,23 |
E | 12 | 92 | 24 | F0,24 |
F | 21 | A1 | 2B | F0,2B |
G | 22 | A2 | 34 | F0,34 |
H | 23 | A3 | 33 | F0,33 |
I | 17 | 97 | 43 | F0,43 |
J | 24 | A4 | 3B | F0,3B |
K | 25 | A5 | 42 | F0,42 |
L | 26 | A6 | 4B | F0,4B |
M | 32 | B2 | 3A | F0,3A |
N | 31 | B1 | 31 | F0,31 |
O | 18 | 98 | 44 | F0,44 |
P | 19 | 99 | 4D | F0,4D |
Q | 10 | 90 | 15 | F0,15 |
R | 13 | 93 | 2D | F0,2D |
S | 1F | 9F | 1B | F0,1B |
T | 14 | 94 | 2C | F0,2C |
U | 16 | 96 | 3C | F0,3C |
V | 2F | AF | 2A | F0,2A |
W | 11 | 91 | 1D | F0,1D |
X | 2D | AD | 22 | F0,22 |
Y | 15 | 95 | 35 | F0,35 |
Z | 2C | AC | 1A | F0,1A |
0 | 0B | 8B | 45 | F0,45 |
1 | 02 | 82 | 16 | F0,16 |
2 | 03 | 83 | 1E | F0,1E |
3 | 04 | 84 | 26 | F0,26 |
4 | 05 | 85 | 25 | F0,25 |
5 | 06 | 86 | 2E | F0,2E |
6 | 07 | 87 | 36 | F0,36 |
7 | 08 | 88 | 3D | F0,3D |
8 | 09 | 89 | 3E | F0,3E |
9 | 0A | 8A | 46 | F0,46 |
~ | 29 | 89 | 0E | F0,0E |
- | 0C | 8C | 4E | F0,4E |
= | 0D | 82 | 55 | F0,55 |
\ | 2B | AB | 5D | F0,5D |
[ | 1A | 9A | 54 | F0,54 |
] | 1B | 9B | 5B | F0,5B |
; | 27 | A7 | 4C | F0,4C |
' | 28 | A8 | 52 | F0,52 |
, | 33 | B3 | 41 | F0,41 |
. | 34 | B4 | 49 | F0,49 |
/ | 35 | B5 | 4A | F0,4A |
BS | 0E | 8E | 66 | F0,66 |
Space | 39 | B9 | 29 | F0,29 |
Tab ↹ | 0F | 8F | 0D | F0,0D |
⇪ Caps Lock | 3A | BA | 58 | F0,58 |
Левый ⇧ Shift | 2A | AA | 12 | F0,12 |
Левый Ctrl | 1D | 9D | 14 | F0,14 |
Левый Alt | 38 | B8 | 11 | F0,11 |
Левый ⊞ Win | E0,5B | E0,DB | E0,1F | E0,F0,1F |
Правый ⇧ Shift | 36 | B6 | 59 | F0,59 |
Правый Ctrl | E0,1D | E0,9D | E0,14 | E0,F0,14 |
Правый Alt | E0,38 | E0,B8 | E0,11 | E0,F0,11 |
Правый ⊞ Win | E0,5C | E0,DC | E0,27 | E0,F0,27 |
≣ Menu | E0,5D | E0,DD | E0,2F | E0,F0,2F |
↵ Enter | 1C | 9C | 5A | F0,5A |
Esc | 01 | 81 | 76 | F0,76 |
F1 | 3B | BB | 05 | F0,05 |
F2 | 3C | BC | 06 | F0,06 |
F3 | 3D | BD | 04 | F0,04 |
F4 | 3E | BE | 0C | F0,0C |
F5 | 3F | BF | 03 | F0,03 |
F6 | 40 | C0 | 0B | F0,0B |
F7 | 41 | C1 | 83 | F0,83 |
F8 | 42 | C2 | 0A | F0,0A |
F9 | 43 | C3 | 01 | F0,01 |
F10 | 44 | C4 | 09 | F0,09 |
F11 | 57 | D7 | 78 | F0,78 |
F12 | 58 | D8 | 07 | F0,07 |
PrtScr | E0,2A,E0,37 | E0,B7,E0,AA | E0,12,E0,7C | E0,F0,7C,E0,F0,12 |
Alt+PrtScr | 54 (вместо PrtScr, код для клавиши Alt генерируется отдельно) | D4 (вместо PrtScr, код для клавиши Alt генерируется отдельно) | ? | ? |
Ctrl+PrtScr, ⇧ Shift+PrtScr (SysReq) | E0,37 (вместо PrtScr, код для Ctrl или ⇧ Shift генерируется отдельно) | E0,B7 (вместо PrtScr, код для Ctrl или ⇧ Shift генерируется отдельно) | ? | ? |
Scroll Lock | 46 | C6 | 7E | F0,7E |
Pause | E1,1D,45, E1,9D,C5 | — | E1,14,77, E1,F0,14,F0,77 | — |
Ctrl+Break (Ctrl+Pause) | E0,46 (вместо Break, код для клавиши Ctrl генерируется отдельно) | E0,C6 (вместо Break, код для клавиши Ctrl генерируется отдельно) | ? | ? |
Insert | E0,52 | E0,D2 | E0,70 | E0,F0,70 |
Home | E0,47 | E0,C7 | E0,6C | E0,F0,6C |
End | E0,4F | E0,CF | E0,69 | E0,F0,69 |
Page Up | E0,49 | E0,C9 | E0,7D | E0,F0,7D |
Page Down | E0,51 | E0,D1 | E0,7A | E0,F0,7A |
Delete | E0,53 | E0,D3 | E0,71 | E0,F0,71 |
↑ | E0,48 | E0,C8 | E0,75 | E0,F0,75 |
← | E0,4B | E0,CB | E0,6B | E0,F0,6B |
↓ | E0,50 | E0,D0 | E0,72 | E0,F0,72 |
→ | E0,4D | E0,CD | E0,74 | E0,F0,74 |
Цифровая клавиатура | ||||
Num Lock | 45 | C5 | 77 | F0,77 |
/ | E0,35 | E0,B5 | E0,4A | E0,F0,4A |
* | 37 | B7 | 7C | F0,7C |
- | 4A | CA | 7B | F0,7B |
+ | 4E | CE | 79 | F0,79 |
↵ Enter | E0,1C | E0,9C | E0,5A | E0,F0,5A |
. | 53 | D3 | 71 | F0,71 |
0 | 52 | D2 | 70 | F0,70 |
1 | 4F | CF | 69 | F0,69 |
2 | 50 | D0 | 72 | F0,72 |
3 | 51 | D1 | 7A | F0,7A |
4 | 4B | CB | 6B | F0,6B |
5 | 4C | CC | 73 | F0,73 |
6 | 4D | CD | 74 | F0,74 |
7 | 47 | C7 | 6C | F0,6C |
8 | 48 | C8 | 75 | F0,75 |
9 | 49 | C9 | 7D | F0,7D |
Клавиши ACPI | ||||
Power | E0,5E | E0,DE | E0,37 | E0,F0,37 |
Sleep | E0,5F | E0,DF | E0,3F | E0,F0,3F |
Wake | E0,63 | E0,E3 | E0,5E | E0,F0,5E |
Мультимедиа клавиши | ||||
Управление проигрывателем | ||||
Следующий трек | E0,19 | E0, 99 | E0, 4D | E0,F0,4D |
Предыдущий трек | E0,10 | E0, 90 | E0,15 | E0,F0,15 |
Остановить | E0,24 | E0,A4 | E0,3B | E0,F0,3B |
Проигрывать/пауза | E0,22 | E0,A2 | E0,34 | E0,F0,34 |
Звук вкл/откл | E0,20 | E0,A0 | E0,23 | E0,F0,23 |
Увеличить громкость | E0,30 | E0,B0 | E0,32 | E0,F0,32 |
Уменьшить громкость | E0,2E | E0,AE | E0,21 | E0,F0,21 |
Управление браузером | ||||
Поиск | E0,65 | E0,E5 | E0,10 | E0,F0,10 |
Домашняя страница | E0,32 | E0,B2 | E0,3A | E0,F0,3A |
Назад | E0,6A | E0,EA | E0,38 | E0,F0,38 |
Вперед | E0,69 | E0,E9 | E0,30 | E0,F0,30 |
Стоп | E0,68 | E0, E8 | E0,28 | E0,F0,28 |
Обновить | E0,67 | E0,E7 | E0,20 | E0,F0,20 |
Закладки | E0,66 | E0, E6 | E0,18 | E0,F0,18 |
Управление приложениями | ||||
Media Select | E0,6D | E0,ED | E0,50 | E0,F0,50 |
Электронная почта | E0,6C | E0,EC | E0,48 | E0,F0,48 |
Калькулятор | E0,21 | E0,A1 | E0,2B | E0,F0,2B |
Мой компьютер | E0,6B | E0,EB | E0,40 | E0,F0,40 |
В чистом DOS клавиша Pause генерирует 6 скан-кодов при нажатии и не генерирует скан-кодов при удержании и отпускании. Под Windows же (в том числе и в VMware и DOSBox) клавиша Pause работает так же, как и любая другая: при нажатии и удержании генерирует скан-коды E1,1D,45, а при отпускании — E1,9D,C5.
Коды клавиш ↓ , ↑ , ← , → , Home , End , Page Up , Page Down , Insert , Delete могут содержать кроме указанных в таблице дополнительно: E0,2A — при нажатии (до основного кода), E0,AA — при отпускании (после основного кода). А при удержании клавиши ⇧ Shift наоборот: E0,AA — при нажатии (до основного кода), E0,2A — при отпускании (после основного кода), код клавиши ⇧ Shift при этом генерируется отдельно.
См. также
Ссылки
wikiredia.ru
Скан-код — Википедия
Материал из Википедии — свободной энциклопедии
Скан-код (англ. scan code) — в IBM-совместимых компьютерах код, присвоенный каждой клавише, с помощью которого драйвер клавиатуры распознает, какая клавиша была нажата. При нажатии любой клавиши контроллер клавиатуры распознаёт клавишу и посылает её скан-код в порт 60h. При отпускании клавиши контроллер клавиатуры устаревшего формата IBM PC/XT посылает в тот же порт скан-код, увеличенный на 80h, а более нового формата IBM PC/AT — два байта: F0h и скан-код (скан-коды клавиатуры AT также отличаются от XT, см. таблицу). Некоторые клавиши генерируют не один, а несколько скан-кодов (так, правые Alt, Ctrl, ↵ Enter, обе ⊞ Win, а также ≣ Menu, Insert, Delete, Page Up, Page Down, Home, End, стрелки и все ACPI- и мультимедиа-клавиши генерируют два скан-кода, первый из которых — E0, клавиша PrtScr генерирует 4 скан-кода, а клавиша Pause — даже 6 скан-кодов). Каждый байт, записанный в порт 60h, генерирует аппаратное прерывание int 09h.
Скан-коды жёстко привязаны к каждой клавише на аппаратном уровне и не зависят ни от состояния индикаторов ⇪ Caps Lock, Num Lock и Scroll Lock, ни от состояния управляющих клавиш (⇧ Shift, Alt, Ctrl).
Скан-коды клавиш
Все скан-коды ниже даются в шестнадцатеричной системе.
Большинство скан-кодов на XT-клавиатуре соответствуют физическому местоположению клавиш, начиная с клавиш Esc (код 01) и цифровых клавиш 1-9 (коды 02-0A). К примеру, клавиши второго ряда (Tab ↹ Q W E R T Y U I O P [ ] ↵ Enter) имеют последовательные скан-коды 0F-1C (15-28 в десятичной системе).
На клавиатурах другой раскладки (например, AZERTY) скан-коды соответствуют расположению клавиш: так, у французского A скан-код как у американского Q. Преобразованием скан-кодов в коды нажатых клавиш занимается ОС или BIOS.
Клавиша | Код нажатия XT | Код отпускания XT | Код нажатия AT | Код отпускания AT |
---|---|---|---|---|
Основная клавиатура | ||||
A | 1E | 9E | 1C | F0,1C |
B | 30 | B0 | 32 | F0,32 |
C | 2E | AE | 21 | F0,21 |
D | 20 | A0 | 23 | F0,23 |
E | 12 | 92 | 24 | F0,24 |
F | 21 | A1 | 2B | F0,2B |
G | 22 | A2 | 34 | F0,34 |
H | 23 | A3 | 33 | F0,33 |
I | 17 | 97 | 43 | F0,43 |
J | 24 | A4 | 38 | F0,3B |
K | 25 | A5 | 42 | F0,42 |
L | 26 | A6 | 4B | F0,4B |
M | 32 | B2 | 3A | F0,3A |
N | 31 | B1 | 31 | F0,31 |
O | 18 | 98 | 44 | F0,44 |
P | 19 | 99 | 4D | F0,4D |
Q | 10 | 90 | 15 | F0,15 |
R | 13 | 93 | 2D | F0,2D |
S | 1F | 9F | 1B | F0,1B |
T | 14 | 94 | 2C | F0,2C |
U | 16 | 96 | 3C | F0,3C |
V | 2F | AF | 2A | F0,2A |
W | 11 | 91 | 1D | F0,1D |
X | 2D | AD | 22 | F0,22 |
Y | 15 | 95 | 35 | F0,35 |
Z | 2C | AC | 1A | F0,1A |
0 | 0B | 8B | 45 | F0,45 |
1 | 02 | 82 | 16 | F0,16 |
2 | 03 | 83 | 1E | F0,1E |
3 | 04 | 84 | 26 | F0,26 |
4 | 05 | 85 | 25 | F0,25 |
5 | 06 | 86 | 2E | F0,2E |
6 | 07 | 87 | 36 | F0,36 |
7 | 08 | 88 | 3D | F0,3D |
8 | 09 | 89 | 3E | F0,3E |
9 | 0A | 8A | 46 | F0,46 |
~ | 29 | 89 | 0E | F0,0E |
- | 0C | 8C | 4E | F0,4E |
= | 0D | 82 | 55 | F0,55 |
\ | 2B | AB | 5D | F0,5D |
[ | 1A | 9A | 54 | F0,54 |
] | 1B | 9B | 5B | F0,5B |
; | 27 | A7 | 4C | F0,4C |
' | 28 | A8 | 52 | F0,52 |
, | 33 | B3 | 41 | F0,41 |
. | 34 | B4 | 49 | F0,49 |
/ | 35 | B5 | 4A | F0,4A |
BS | 0E | 8E | 66 | F0,66 |
Space | 39 | B9 | 29 | F0,29 |
Tab ↹ | 0F | 8F | 0D | F0,0D |
⇪ Caps Lock | 3A | BA | 58 | F0,58 |
Левый ⇧ Shift | 2A | AA | 12 | F0,12 |
Левый Ctrl | 1D | 9D | 14 | F0,14 |
Левый Alt | 38 | B8 | 11 | F0,11 |
Левый ⊞ Win | E0,5B | E0,DB | E0,1F | E0,F0,1F |
Правый ⇧ Shift | 36 | B6 | 59 | F0,59 |
Правый Ctrl | E0,1D | E0,9D | E0,14 | E0,F0,14 |
Правый Alt | E0,38 | E0,B8 | E0,11 | E0,F0,11 |
Правый ⊞ Win | E0,5C | E0,DC | E0,27 | E0,F0,27 |
≣ Menu | E0,5D | E0,DD | E0,2F | E0,F0,2F |
↵ Enter | 1C | 9C | 5A | F0,5A |
Esc | 01 | 81 | 76 | F0,76 |
F1 | 3B | BB | 05 | F0,05 |
F2 | 3C | BC | 06 | F0,06 |
F3 | 3D | BD | 04 | F0,04 |
F4 | 3E | BE | 0C | F0,0C |
F5 | 3F | BF | 03 | F0,03 |
F6 | 40 | C0 | 0B | F0,0B |
F7 | 41 | C1 | 83 | F0,83 |
F8 | 42 | C2 | 0A | F0,0A |
F9 | 43 | C3 | 01 | F0,01 |
F10 | 44 | C4 | 09 | F0,09 |
F11 | 57 | D7 | 78 | F0,78 |
F12 | 58 | D8 | 07 | F0,07 |
PrtScr | E0,2A,E0,37 | E0,B7,E0,AA | E0,12,E0,7C | E0,F0,7C,E0,F0,12 |
Alt+PrtScr | 54 (вместо PrtScr, код для клавиши Alt генерируется отдельно) | D4 (вместо PrtScr, код для клавиши Alt генерируется отдельно) | ? | ? |
Ctrl+PrtScr, ⇧ Shift+PrtScr (SysReq) | E0,37 (вместо PrtScr, код для Ctrl или ⇧ Shift генерируется отдельно) | E0,B7 (вместо PrtScr, код для Ctrl или ⇧ Shift генерируется отдельно) | ? | ? |
Scroll Lock | 46 | C6 | 7E | F0,7E |
Pause | E1,1D,45, E1,9D,C5 | — | E1,14,77, E1,F0,14,F0,77 | — |
Ctrl+Break (Ctrl+Pause) | E0,46 (вместо Break, код для клавиши Ctrl генерируется отдельно) | E0,C6 (вместо Break, код для клавиши Ctrl генерируется отдельно) | ? | ? |
Insert | E0,52 | E0,D2 | E0,70 | E0,F0,70 |
Home | E0,47 | E0,C7 | E0,6C | E0,F0,6C |
End | E0,4F | E0,CF | E0,69 | E0,F0,69 |
Page Up | E0,49 | E0,C9 | E0,7D | E0,F0,7D |
Page Down | E0,51 | E0,D1 | E0,7A | E0,F0,7A |
Delete | E0,53 | E0,D3 | E0,71 | E0,F0,71 |
↑ | E0,48 | E0,C8 | E0,75 | E0,F0,75 |
← | E0,4B | E0,CB | E0,6B | E0,F0,6B |
↓ | E0,50 | E0,D0 | E0,72 | E0,F0,70 |
→ | E0,4D | E0,CD | E0,74 | E0,F0,74 |
Цифровая клавиатура | ||||
Num Lock | 45 | C5 | 77 | F0,77 |
/ | E0,35 | E0,B5 | E0,4A | E0,F0,4A |
* | 37 | B7 | 7C | F0,7C |
- | 4A | CA | 7B | F0,7B |
+ | 4E | CE | 79 | F0,79 |
↵ Enter | E0,1C | E0,9C | E0,5A | E0,F0,5A |
. | 53 | D3 | 71 | F0,71 |
0 | 52 | D2 | 70 | F0,70 |
1 | 4F | CF | 69 | F0,69 |
2 | 50 | D0 | 72 | F0,72 |
3 | 51 | D1 | 7A | F0,7A |
4 | 4B | CB | 6B | F0,6B |
5 | 4C | CC | 73 | F0,73 |
6 | 4D | CD | 74 | F0,74 |
7 | 47 | C7 | 6C | F0,6C |
8 | 48 | C8 | 75 | F0,75 |
9 | 49 | C9 | 7D | F0,7D |
Клавиши ACPI | ||||
Power | E0,5E | E0,DE | E0,37 | E0,F0,37 |
Sleep | E0,5F | E0,DF | E0,3F | E0,F0,3F |
Wake | E0,63 | E0,E3 | E0,5E | E0,F0,5E |
Мультимедиа клавиши | ||||
Управление проигрывателем | ||||
Следующий трек | E0,19 | E0, 99 | E0, 4D | E0,F0,4D |
Предыдущий трек | E0,10 | E0, 90 | E0,15 | E0,F0,15 |
Остановить | E0,24 | E0,A4 | E0,3B | E0,F0,3B |
Проигрывать/пауза | E0,22 | E0,A2 | E0,34 | E0,F0,3B |
Звук вкл/откл | E0,20 | E0,A0 | E0,23 | E0,F0,23 |
Увеличить громкость | E0,30 | E0,B0 | E0,32 | E0,F0,32 |
Уменьшить громкость | E0,2E | E0,AE | E0,21 | E0,F0,21 |
Управление браузером | ||||
Поиск | E0,65 | E0,E5 | E0,10 | E0,F0,10 |
Домашняя страница | E0,32 | E0,B2 | E0,3A | E0,F0,3A |
Назад | E0,6A | E0,EA | E0,38 | E0,F0,38 |
Вперед | E0,69 | E0,E9 | E0,30 | E0,F0,30 |
Стоп | E0,68 | E0, E8 | E0,28 | E0,F0,28 |
Обновить | E0,67 | E0,E7 | E0,20 | E0,F0,20 |
Закладки | E0,66 | E0, E6 | E0,18 | E0,F0,18 |
Управление приложениями | ||||
Media Select | E0,6D | E0,ED | E0,50 | E0,F0,50 |
Электронная почта | E0,6C | E0,EC | E0,48 | E0,F0,48 |
Калькулятор | E0,21 | E0,A1 | E0,2B | E0,F0,2B |
Мой компьютер | E0,6B | E0,EB | E0,40 | E0,F0,40 |
В чистом DOS клавиша Pause генерирует 6 скан-кодов при нажатии и не генерирует скан-кодов при удержании и отпускании. Под Windows же (в том числе и в VMware и DOSBox) клавиша Pause работает так же, как и любая другая: при нажатии и удержании генерирует скан-коды E1,1D,45, а при отпускании — E1,9D,C5.
Коды клавиш ↓ , ↑ , ← , → , Home , End , Page Up , Page Down , Insert , Delete могут содержать кроме указанных в таблице дополнительно: E0,2A — при нажатии (до основного кода), E0,AA — при отпускании (после основного кода). А при удержании клавиши ⇧ Shift наоборот: E0,AA — при нажатии (до основного кода), E0,2A — при отпускании (после основного кода), код клавиши ⇧ Shift при этом генерируется отдельно.
См. также
Ссылки
wikipedia.green