Скан-код
Скан-код (англ. 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 | Код USB HID |
---|---|---|---|---|---|
Основная клавиатура | |||||
A | 1E | 9E | 1C | F0,1C | 04 |
B | 30 | B0 | 32 | F0,32 | 05 |
C | 2E | AE | 21 | F0,21 | 06 |
D | 20 | A0 | 23 | F0,23 | 07 |
E | 12 | 92 | 24 | F0,24 | 08 |
F | 21 | A1 | 2B | F0,2B | 09 |
G | 22 | A2 | 34 | F0,34 | 0A |
H | 23 | A3 | 33 | F0,33 | 0B |
I | 17 | 97 | 43 | F0,43 | 0C |
J | 24 | A4 | 3B | F0,3B | 0D |
K | 25 | A5 | 42 | F0,42 | 0E |
L | 26 | A6 | 4B | F0,4B | 0F |
M | 32 | B2 | 3A | F0,3A | 10 |
N | 31 | B1 | 31 | F0,31 | 11 |
O | 18 | 98 | 44 | F0,44 | 12 |
P | 19 | 99 | 4D | F0,4D | 13 |
Q | 10 | 90 | 15 | F0,15 | 14 |
R | 13 | 93 | 2D | F0,2D | 15 |
S | 1F | 9F | 1B | F0,1B | 16 |
T | 14 | 94 | 2C | F0,2C | 17 |
U | 16 | 96 | 3C | F0,3C | 18 |
V | 2F | AF | 2A | F0,2A | 19 |
W | 11 | 91 | 1D | F0,1D | 1A |
X | 2D | AD | 22 | F0,22 | 1B |
Y | 15 | 95 | 35 | F0,35 | 1C |
Z | 2C | AC | 1A | F0,1A | 1D |
0 | 0B | 8B | 45 | F0,45 | 27 |
1 | 02 | 82 | 16 | F0,16 | 1E |
2 | 03 | 83 | 1E | F0,1E | 1F |
3 | 04 | 84 | 26 | F0,26 | 20 |
4 | 05 | 85 | 25 | F0,25 | 21 |
5 | 06 | 86 | 2E | F0,2E | 22 |
6 | 07 | 87 | 36 | F0,36 | 23 |
7 | 08 | 88 | 3D | F0,3D | 24 |
8 | 09 | 89 | 3E | F0,3E | 25 |
9 | 0A | 8A | 46 | F0,46 | 26 |
~ | 29 | 89 | 0E | F0,0E | 35 |
- | 0C | 8C | 4E | F0,4E | 2D |
= | 0D | 82 | 55 | F0,55 | 2E |
\ | 2B | AB | 5D | F0,5D | 31 или 64 |
[ | 1A | 9A | 54 | F0,54 | 2F |
] | 1B | 9B | 5B | F0,5B | 30 |
; | 27 | A7 | 4C | F0,4C | 33 |
' | 28 | A8 | 52 | F0,52 | 34 |
, | 33 | B3 | 41 | F0,41 | 36 |
. | 34 | B4 | 49 | F0,49 | 37 |
/ | 35 | B5 | 4A | F0,4A | 38 |
BS | 0E | 8E | 66 | F0,66 | 2A |
Space | 39 | B9 | 29 | F0,29 | 2C |
Tab ↹ | 0F | 8F | 0D | F0,0D | 2B |
⇪ Caps Lock | 3A | BA | 58 | F0,58 | 39 |
Левый ⇧ Shift | 2A | AA | 12 | F0,12 | E1 |
Левый Ctrl | 1D | 9D | 14 | F0,14 | E0 |
Левый Alt | 38 | B8 | 11 | F0,11 | E2 |
Левый ⊞ Win | E0,5B | E0,DB | E0,1F | E0,F0,1F | E3 |
Правый ⇧ Shift | 36 | B6 | 59 | F0,59 | E5 |
Правый Ctrl | E0,1D | E0,9D | E0,14 | E0,F0,14 | E4 |
Правый Alt | E0,38 | E0,B8 | E0,11 | E0,F0,11 | E6 |
Правый ⊞ Win | E0,5C | E0,DC | E0,27 | E0,F0,27 | E7 |
≣ Menu | E0,5D | E0,DD | E0,2F | E0,F0,2F | 65 |
↵ Enter | 1C | 9C | 5A | F0,5A | 28 |
Esc | 01 | 81 | 76 | F0,76 | 29 |
F1 | 3B | BB | 05 | F0,05 | 3A |
F2 | 3C | BC | 06 | F0,06 | 3B |
F3 | 3D | BD | 04 | F0,04 | 3C |
F4 | 3E | BE | 0C | F0,0C | 3D |
F5 | 3F | BF | 03 | F0,03 | 3E |
F6 | 40 | C0 | 0B | F0,0B | 3F |
F7 | 41 | C1 | 83 | F0,83 | 40 |
F8 | 42 | C2 | 0A | F0,0A | 41 |
F9 | 43 | C3 | 01 | F0,01 | 42 |
F10 | 44 | C4 | 09 | F0,09 | 43 |
F11 | 57 | D7 | 78 | F0,78 | 44 |
F12 | 58 | D8 | 07 | F0,07 | 45 |
PrtScr | E0,2A,E0,37 | E0,B7,E0,AA | E0,12,E0,7C | E0,F0,7C,E0,F0,12 | 46 |
Alt+PrtScr | 54 (вместо PrtScr,
код для клавиши Alt генерируется отдельно) |
D4 (вместо PrtScr,
код для клавиши Alt генерируется отдельно) |
? | ? | — |
Ctrl+PrtScr,
⇧ Shift+PrtScr (SysReq) |
E0,37 (вместо PrtScr,
код для Ctrl или ⇧ Shift генерируется отдельно) |
E0,B7 (вместо PrtScr,
код для Ctrl или ⇧ Shift генерируется отдельно) |
? | ? | 9A |
Scroll Lock | 46 | C6 | 7E | F0,7E | 47 |
Pause | E1,1D,45, E1,9D,C5 | — | E1,14,77, E1,F0,14,F0,77 | — | 48 |
Ctrl+Break
(Ctrl+Pause) |
E0,46 (вместо Break,
код для клавиши Ctrl генерируется отдельно) |
E0,C6 (вместо Break,
код для клавиши Ctrl генерируется отдельно) |
? | ? | — |
Insert | E0,52 | E0,D2 | E0,70 | E0,F0,70 | 49 |
Home | E0,47 | E0,C7 | E0,6C | E0,F0,6C | 4A |
End | E0,4F | E0,CF | E0,69 | E0,F0,69 | 4D |
Page Up | E0,49 | E0,C9 | E0,7D | E0,F0,7D | 4B |
Page Down | E0,51 | E0,D1 | E0,7A | E0,F0,7A | 4E |
Delete | E0,53 | E0,D3 | E0,71 | E0,F0,71 | 4C |
↑ | E0,48 | E0,C8 | E0,75 | E0,F0,75 | 52 |
← | E0,4B | E0,CB | E0,6B | E0,F0,6B | 50 |
↓ | E0,50 | E0,D0 | E0,72 | E0,F0,72 | 51 |
→ | E0,4D | E0,CD | E0,74 | E0,F0,74 | 4F |
Цифровая клавиатура | |||||
Num Lock | 45 | C5 | 77 | F0,77 | 53 |
/ | E0,35 | E0,B5 | E0,4A | E0,F0,4A | 54 |
* | 37 | B7 | 7C | F0,7C | 55 |
- | 4A | CA | 7B | F0,7B | 56 |
+ | 4E | CE | 79 | F0,79 | 57 |
↵ Enter | E0,1C | E0,9C | E0,5A | E0,F0,5A | 58 |
. | 53 | D3 | 71 | F0,71 | 63 |
0 | 52 | D2 | 70 | F0,70 | 62 |
1 | 4F | CF | 69 | F0,69 | 59 |
2 | 50 | D0 | 72 | F0,72 | 5A |
3 | 51 | D1 | 7A | F0,7A | 5B |
4 | 4B | CB | 6B | F0,6B | 5C |
5 | 4C | CC | 73 | F0,73 | 5D |
6 | 4D | CD | 74 | F0,74 | 5E |
7 | 47 | C7 | 6C | F0,6C | 5F |
8 | 48 | C8 | 75 | F0,75 | 60 |
9 | 49 | C9 | 7D | F0,7D | 61 |
Клавиши ACPI | |||||
Power | E0,5E | E0,DE | E0,37 | E0,F0,37 | A5 |
Sleep | E0,5F | E0,DF | E0,3F | E0,F0,3F | A6 |
Wake | E0,63 | E0,E3 | E0,5E | E0,F0,5E | A7 |
Мультимедиа-клавиши | |||||
Управление проигрывателем | |||||
Следующий трек | E0,19 | E0, 99 | E0, 4D | E0,F0,4D | AB |
Предыдущий трек | E0,10 | E0, 90 | E0,15 | E0,F0,15 | AC |
Остановить | E0,24 | E0,A4 | E0,3B | E0,F0,3B | AD |
Проигрывать/пауза | E0,22 | E0,A2 | E0,34 | E0,F0,34 | AE |
Звук вкл/откл | E0,20 | E0,A0 | E0,23 | E0,F0,23 | A8 |
Увеличить громкость | E0,30 | E0,B0 | E0,32 | E0,F0,32 | A9 |
Уменьшить громкость | E0,2E | E0,AE | E0,21 | E0,F0,21 | AA |
Управление браузером | |||||
Поиск | E0,65 | E0,E5 | E0,10 | E0,F0,10 | B4 |
Домашняя страница | E0,32 | E0,B2 | E0,3A | E0,F0,3A | B5 |
Назад | E0,6A | E0,EA | E0,38 | E0,F0,38 | B6 |
Вперед | E0,69 | E0,E9 | E0,30 | E0,F0,30 | B7 |
Стоп | E0,68 | E0, E8 | E0,28 | E0,F0,28 | B8 |
Обновить | E0,67 | E0,E7 | E0,20 | E0,F0,20 | B9 |
Закладки | E0,66 | E0, E6 | E0,18 | E0,F0,18 | BA |
Управление приложениями | |||||
Media Select | E0,6D | E0,ED | E0,50 | E0,F0,50 | BO |
Электронная почта | E0,6C | E0,EC | E0,48 | E0,F0,48 | B1 |
Калькулятор | E0,21 | E0,A1 | E0,2B | E0,F0,2B | B2 |
Мой компьютер | E0,6B | E0,EB | E0,40 | E0,F0,40 | B3 |
- ¹E0,2A,E0,37
- ²E1,1D,45, E1,9D,C5
- ¹E0,12,E0,7C
- ²E1,14,77, E1,F0,14,F0,77
В чистом 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 при этом генерируется отдельно.
Во времена, когда многие корпоративные пользователи работали на терминалах, подключенных к мейнфреймам, существовали 122-клавишные клавиатуры, у которых имелся дополнительный ряд функциональных клавиш — от F12 до F24 (см. Model F keyboard[англ.], Model M keyboard[англ.], самой популярной из них была IBM Model M 122, выпущенная в 1985 году). Сейчас Microsoft также задействовала код этих клавиш для специальной клавиши [Copilot] (имеется на клавиатурах некоторых новых ноутбуков): её скан-код — левый Ctrl + ⊞ Win + F23)[1].
См. также
править- ASCII код
Литература
править- IBM Personal System/2™ Model 25: Technical Reference. — International Business Machines Corporation, 1987. — (IBM Personal Computer Hardware Reference Library).
Ссылки
править- Keyboard Scan Codes (XT) Архивная копия от 27 января 2012 на Wayback Machine
- Keyboard Scan Codes (AT) Архивная копия от 21 января 2012 на Wayback Machine
- Документация по USB HID, включая скан-коды клавиш
Примечания
править- ↑ Кнопка Windows Copilot взята из эпохи IBM, но вы можете переназначить ее Архивная копия от 7 апреля 2024 на Wayback Machine // Rutab.net, 2 апреля 2024
В статье не хватает ссылок на источники (см. рекомендации по поиску). |