Чернетка. Turbo Pascal. Коды клавиш
Чернетка. Turbo Pascal. Коды клавиш
Сообщений 1 страница 5 из 5
Поделиться22023-03-12 09:50:12
https://aspektcenter.ru/tablitsa-kodov-klavish-pascal/
Выполнение программы прерывается до тех пор, пока не будет нажата клавиша. Если в буфере клавиатуры уже есть необработанные нажатия, сразу возвращает результат. Проверить, была ли нажата клавиша, можно вызовом функции KeyPressed .
При нажатии некоторых специальных клавиш (стрелки и функциональные клавиши) ReadKey возвращает нулевой символ (#0), а повторный вызов ReadKey возвратит сканкод нажатой клавиши.
Обычные символы перечислены в таблице кодов символов 866 .
Коды специальных клавиш
Клавиша Что возвращает ReadKey?
Escape #27
Enter #13
Ctrl+Enter #10
Backspace #8
Ctrl+Backspace #127
Tab #9
Shift+Tab #15
F1 #0, #59
F2 #0, #60
F3 #0, #61
F4 #0, #62
F5 #0, #63
F6 #0, #64
F7 #0, #65
F8 #0, #66
F9 #0, #67
F10 #0, #68
← #0, #75
↑ #0, #72
→ #0, #77
↓ #0, #80
Delete #0, #83
Insert #0, #82
Home #0, #71
End #0, #79
Page Up #0, #73
Page Down #0, #81
NumPad 5 1 #0, #76
Shift+F1 #0, #84
Shift+F2 #0, #85
Shift+F3 #0, #86
Shift+F4 #0, #87
Shift+F5 #0, #88
Shift+F6 #0, #89
Shift+F7 #0, #90
Shift+F8 #0, #91
Shift+F9 #0, #92
Shift+F10 #0, #93
Ctrl+F1 #0, #94
Ctrl+F2 #0, #95
Ctrl+F3 #0, #96
Ctrl+F4 #0, #97
Ctrl+F5 #0, #98
Ctrl+F6 #0, #99
Ctrl+F7 #0, #100
Ctrl+F8 #0, #101
Ctrl+F9 #0, #102
Ctrl+F10 #0, #103
Alt+F1 #0, #104
Alt+F2 #0, #105
Alt+F3 #0, #106
Alt+F4 #0, #107
Alt+F5 #0, #108
Alt+F6 #0, #109
Alt+F7 #0, #110
Alt+F8 #0, #111
Alt+F9 #0, #112
Alt+F10 #0, #113
Ctrl+← #0, #115
Ctrl+→ #0, #116
Ctrl+Home #0, #119
Ctrl+End #0, #117
Ctrl+Page Up #0, #132
Ctrl+Page Down #0, #118
Ctrl+2 #0, #3
Ctrl+A #1
Ctrl+B #2
Ctrl+C 2 #3
Ctrl+D #4
Ctrl+E #5
Ctrl+F #6
Ctrl+G #7
Ctrl+H 3 #8
Ctrl+I #9
Ctrl+J #10
Ctrl+K #11
Ctrl+L #12
Ctrl+M #13
Ctrl+N #14
Ctrl+O #15
Ctrl+P #16
Ctrl+Q #17
Ctrl+R #18
Ctrl+S #19
Ctrl+T #20
Ctrl+U #21
Ctrl+V #22
Ctrl+W #23
Ctrl+X #24
Ctrl+Y #25
Ctrl+Z #26
Ctrl+[ #27
Ctrl+\ #28
Ctrl+] #29
Ctrl+6 #30
Ctrl+— #31
Alt+Q #0, #16
Alt+W #0, #17
Alt+E #0, #18
Alt+R #0, #19
Alt+T #0, #20
Alt+Y #0, #21
Alt+U #0, #22
Alt+I #0, #23
Alt+O #0, #24
Alt+P #0, #25
Alt+A #0, #30
Alt+S #0, #31
Alt+D #0, #32
Alt+F #0, #33
Alt+G #0, #34
Alt+H #0, #35
Alt+J #0, #36
Alt+K #0, #37
Alt+L #0, #38
Alt+Z #0, #44
Alt+X #0, #45
Alt+C #0, #46
Alt+V #0, #47
Alt+B #0, #48
Alt+N #0, #49
Alt+M #0, #50
Alt+1 #0, #120
Alt+2 #0, #121
Alt+3 #0, #122
Alt+4 #0, #123
Alt+5 #0, #124
Alt+6 #0, #125
Alt+7 #0, #126
Alt+8 #0, #127
Alt+9 #0, #128
Alt+ #0, #129
Alt+— #0, #130
Alt+= #0, #131
Поделиться32023-03-12 17:03:55
https://keycode.inicar.info/KeyCode/2_KeyCode_Table.php
Коды клавиш клавиатуры
Таблица кодов клавиш клавиатуры
Code: 75
Key Code Key Code Key Code backspace 8 tab 9 enter 13 shift 16 ctrl 17 alt 18 pause/break 19 caps lock 20 escape 27 page up 33 page down 34 end 35 home 36 left arrow 37 up arrow 38 right arrow 39 down arrow 40 insert 45 delete 46 0 48 1 49 2 50 3 51 4 52 5 53 6 54 7 55 8 56 9 57 a 65 b 66 c 67 d 68 e 69 f 70 g 71 h 72 i 73 j 74 k 75 l 76 m 77 n 78 o 79 p 80 q 81 r 82 s 83 t 84 u 85 v 86 w 87 x 88 y 89 z 90 left window key 91 right window key 92 select key 93 numpad 0 96 numpad 1 97 numpad 2 98 numpad 3 99 numpad 4 100 numpad 5 101 numpad 6 102 numpad 7 103 numpad 8 104 numpad 9 105 multiply 106 add 107 subtract 109 decimal point 110 divide 111 f1 112 f2 113 f3 114 f4 115 f5 116 f6 117 f7 118 f8 119 f9 120 f10 121 f11 122 f12 123 num lock 144 scroll lock 145 semi-colon 186 equal sign 187 comma 188 dash 189 period 190 forward slash 191 grave accent 192 open bracket 219 back slash 220 close braket 221 single quote 222
Поделиться42023-03-12 17:14:59
Как прочитать нажатия клавиш Ctrl, Alt, Shift?
Главная / FAQ / Работа с клавиатурой
Для функции ReadKey эти клавиши не генерируют никаких кодов. Однако, информация о нажатии подобных клавиш все-таки имеется и располагается в памяти (область данных BIOS) по адресу:
Seg0040:$17 - Keyboard Status Flags #1 (основные флаги спец.клавиш)
Ячейка Seg0040:$0017:
<-+---- номера битов
є7+6+5+4+3+2+1+0|
|i|c|n|s|A|^|S|S| Бит Знач. Назначение бита
Іs+s+s+s+-+-+L+R| N
| | | | | | | +-. 0: 01h нажат Right-shift
| | | | | | +---. 1: 02h нажат Left-shift
| | | | | +-----. 2: 04h нажат Ctrl (любой)
| | | | +-------. 3: 08h нажат Alt (любой)
| | | +---------. 4: 10h состяние ScrollLock
| | +-----------. 5: 20h состяние NumLock
| +-------------. 6: 40h состяние CapsLock
+---------------. 7: 80h состяние Insert
В этих ячейках каждый бит отвечает за одну конкретную спец.клавишу - если бит установлен, то клавиша нажата, если сброшен - то не нажата. Исключение составляют клавиши ScrollLock, NumLock, CapsLock, Insert - при первом нажатии соответствующий бит устанавливается в 1, а при следующем - сбрасывается в 0.
Вот вам функция для вытаскивания этой информации из байтов Seg040:$17.
Пример вызова: if GetLockKey(Ctrl) then {нажат Ctrl}
Type
Keytype=(Ins, Caps, Num, Scroll, Ctrl, Alt, LShift, RShift);
function GetLockKey(lock:Keytype):Boolean;
{Проверяет, нажата ли спец.клавиша}
var b:word;
begin
case lock of
Ins : b:=$0080;
Caps : b:=$0040;
Num : b:=$0020;
Scroll : b:=$0010;
Alt : b:=$0008;
Ctrl : b:=$0004;
LShift : b:=$0002;
RShift : b:=$0001;
end;
if (mem[0:$417] and b)=b then GetLockKey:=true
else GetLockKey:=false;
end;
Аналогично можно анализировать и байт по адресу Seg040:$18 (Keyboard Status Flags #2)
Ячейка Seg0040:$0018:
<-+---- номера битов
є7+6+5+4+3+2+1+0|
|i|c|n|s|p|q|A|^| Бит Знач. Назначение бита
Іd+d+d+d+-+d+l+l| N
| | | | | | | +-. 0: 01h нажат левый Ctrl
| | | | | | +---. 1: 02h нажат левый Alt
| | | | | +-----. 2: 04h SysReq DOWN
| | | | +-------. 3: 08h hold/pause state
| | | +---------. 4: 10h нажат ScrollLock
| | +-----------. 5: 20h нажат NumLock
| +-------------. 6: 40h нажат CapsLock
+---------------. 7: 80h нажат Insert
Посмотрите на прилагаемый тест, попробуйте нажать несколько клавиш сразу, обратите внимание на то, что статус клавиатуры изменяется как при нажатии на клавиши, так и при отпускании тоже!
Uses CRT;
Const
RightShift = $0001;
LeftShift = $0002;
AnyCtrl = $0004;
AnyAlt = $0008;
ScrollActive = $0010;
NumLockActive = $0020;
CapsLockActive= $0040;
InsActive = $0080;
LeftCtrl = $0100;
LeftAlt = $0200;
SysReq = $0400;
PauseKey = $0800;
ScrollLock = $1000;
NumLock = $2000;
CapsLock = $4000;
Insert = $8000;
const hex_num:array [0..15] of char='0123456789ABCDEF';
var
key:char; {код нажатой клавиши}
flags:word; {флаги состояния клавиатуры}
newflags:word;
function word2hex(w:word):string;
{перевод в 16-ричное число}
var
b:array[1..2] of byte absolute w;
begin
word2hex:=hex_num[b[2] shr 4]+hex_num[b[2] and $0F] +
hex_num[b[1] shr 4]+hex_num[b[1] and $0F]
end;
function GetFlags:Word;
{Считывает состояние флагов спец.клавиш}
begin
GetFlags:=memW[0:$417];
end;
function AnyKeyEvent:boolean;
begin
AnyKeyEvent:= (KeyPressed or (newflags<>flags));
end;
function Pressed(lock:word):Boolean;
{Проверяет, нажата ли спец.клавиша с кодом LOCK}
begin
if (flags and word(lock))<>0 then Pressed:=true
else Pressed:=false;
end;
Procedure WriteKeyCode;
begin
TextAttr:=White;
If KeyPressed then begin
key:= ReadKey; {читаем код }
if Key = #0 then begin {код оказался расширенным}
Write(Ord(Key):3,','); {печатаем нулевой код }
key:= ReadKey; {читаем расширенный код }
end;
Write(Ord(Key):3); {печатаем основной код }
end
else write(' ');
end;
Procedure WriteFlags;
begin
TextAttr:=LightGray;
Write(' Flags:',word2hex(memW[Seg0040:$17]));
{Теперь печатаем флаги спец.клавиш}
TextAttr:=Cyan;
If Pressed(RightShift) then Write(' RightShift');
If Pressed(LeftShift ) then Write(' LeftShift');
If Pressed(AnyAlt ) then Write(' AnyAlt');
If Pressed(AnyCtrl ) then Write(' AnyCtrl');
If Pressed(LeftCtrl ) then Write(' LeftCtrl');
If Pressed(LeftAlt ) then Write(' LeftAlt');
If Pressed(SysReq ) then Write(' SysReq');
If Pressed(PauseKey ) then Write(' Pause');
If Pressed(ScrollLock) then Write(' ScrollLock');
If Pressed(NumLock ) then Write(' NumLock');
If Pressed(CapsLock ) then Write(' CapsLock');
If Pressed(Insert ) then Write(' Insert');
{Теперь печатаем состояние переключателей}
TextAttr:=Yellow;
If Pressed(ScrollActive ) then Write(' ScrollLockActive');
If Pressed(NumLockActive ) then Write(' NumLockActive');
If Pressed(CapsLockActive) then Write(' CapsLockActive');
If Pressed(InsActive ) then Write(' InsActive');
Writeln;
TextAttr:=LightGray;
end;
begin
while keypressed do readkey; {Очистить буфер клавиатуры}
flags:=GetFlags; {начальное состояние флагов}
repeat
newflags:=GetFlags; {новое состояние флагов}
If AnyKeyEvent then begin {если чего-нибудь нажато}
WriteKeyCode;
flags:=newflags; {запомнить состояние флагов}
WriteFlags;
end;
until Key = #27; {Цикл, пока не нажмем Esc}
while keypressed do readkey; {Очистить буфер клавиатуры}
end.
© 2009–2023 Russian Pascal Developer Network.
Техническая площадка: ISBIZ ХостингISBIZ.agency
продвижение сайта
Поделиться52023-03-12 21:30:46
TP4_0
KeyShift
Uses CRT; Const RightShift = $0001; LeftShift = $0002; AnyCtrl = $0004; AnyAlt = $0008; ScrollActive = $0010; NumLockActive = $0020; CapsLockActive= $0040; InsActive = $0080; LeftCtrl = $0100; LeftAlt = $0200; SysReq = $0400; PauseKey = $0800; ScrollLock = $1000; NumLock = $2000; CapsLock = $4000; Insert = $8000; const hex_num:array [0..15] of char='0123456789ABCDEF'; var key:char; {код нажатой клавиши} flags:word; {флаги состояния клавиатуры} newflags:word; function word2hex(w:word):string; {перевод в 16-ричное число} var b:array[1..2] of byte absolute w; begin word2hex:=hex_num[b[2] shr 4]+hex_num[b[2] and $0F] + hex_num[b[1] shr 4]+hex_num[b[1] and $0F] end; function GetFlags:Word; {Считывает состояние флагов спец.клавиш} begin GetFlags:=memW[0:$417]; end; function AnyKeyEvent:boolean; begin AnyKeyEvent:= (KeyPressed or (newflags<>flags)); end; function Pressed(lock:word):Boolean; {Проверяет, нажата ли спец.клавиша с кодом LOCK} begin if (flags and word(lock))<>0 then Pressed:=true else Pressed:=false; end; Procedure WriteKeyCode; begin TextAttr:=White; If KeyPressed then begin key:= ReadKey; {читаем код } if Key = #0 then begin {код оказался расширенным} Write(Ord(Key):3,','); {печатаем нулевой код } key:= ReadKey; {читаем расширенный код } end; Write(Ord(Key):3); {печатаем основной код } end else write(' '); end; Procedure WriteFlags; begin TextAttr:=LightGray; { Write(' Flags:',word2hex(memW[Seg0040:$17]));} {Теперь печатаем флаги спец.клавиш} TextAttr:=Cyan; If Pressed(RightShift) then Write(' RightShift'); If Pressed(LeftShift ) then Write(' LeftShift'); If Pressed(AnyAlt ) then Write(' AnyAlt'); If Pressed(AnyCtrl ) then Write(' AnyCtrl'); If Pressed(LeftCtrl ) then Write(' LeftCtrl'); If Pressed(LeftAlt ) then Write(' LeftAlt'); If Pressed(SysReq ) then Write(' SysReq'); If Pressed(PauseKey ) then Write(' Pause'); If Pressed(ScrollLock) then Write(' ScrollLock'); If Pressed(NumLock ) then Write(' NumLock'); If Pressed(CapsLock ) then Write(' CapsLock'); If Pressed(Insert ) then Write(' Insert'); {Теперь печатаем состояние переключателей} TextAttr:=Yellow; If Pressed(ScrollActive ) then Write(' ScrollLockActive'); If Pressed(NumLockActive ) then Write(' NumLockActive'); If Pressed(CapsLockActive) then Write(' CapsLockActive'); If Pressed(InsActive ) then Write(' InsActive'); Writeln; TextAttr:=LightGray; end; begin { while keypressed do readkey; } {Очистить буфер клавиатуры} flags:=GetFlags; {начальное состояние флагов} repeat newflags:=GetFlags; {новое состояние флагов} If AnyKeyEvent then begin {если чего-нибудь нажато} WriteKeyCode; flags:=newflags; {запомнить состояние флагов} WriteFlags; end; until Key = #27; {Цикл, пока не нажмем Esc} { while keypressed do readkey; } {Очистить буфер клавиатуры} end. Как прочитать нажатия клавиш Ctrl, Alt, Shift? Главная / FAQ / Работа с клавиатурой Для функции ReadKey эти клавиши не генерируют никаких кодов. Однако, информация о нажатии подобных клавиш все-таки имеется и располагается в памяти (область данных BIOS) по адресу: Seg0040:$17 - Keyboard Status Flags #1 (основные флаги спец.клавиш) Ячейка Seg0040:$0017: <-+---- номера битов є7+6+5+4+3+2+1+0| |i|c|n|s|A|^|S|S| Бит Знач. Назначение бита Іs+s+s+s+-+-+L+R| N | | | | | | | +-. 0: 01h нажат Right-shift | | | | | | +---. 1: 02h нажат Left-shift | | | | | +-----. 2: 04h нажат Ctrl (любой) | | | | +-------. 3: 08h нажат Alt (любой) | | | +---------. 4: 10h состяние ScrollLock | | +-----------. 5: 20h состяние NumLock | +-------------. 6: 40h состяние CapsLock +---------------. 7: 80h состяние Insert В этих ячейках каждый бит отвечает за одну конкретную спец.клавишу - если бит установлен, то клавиша нажата, если сброшен - то не нажата. Исключение составляют клавиши ScrollLock, NumLock, CapsLock, Insert - при первом нажатии соответствующий бит устанавливается в 1, а при следующем - сбрасывается в 0. Вот вам функция для вытаскивания этой информации из байтов Seg040:$17. Пример вызова: if GetLockKey(Ctrl) then {нажат Ctrl} Type Keytype=(Ins, Caps, Num, Scroll, Ctrl, Alt, LShift, RShift); function GetLockKey(lock:Keytype):Boolean; {Проверяет, нажата ли спец.клавиша} var b:word; begin case lock of Ins : b:=$0080; Caps : b:=$0040; Num : b:=$0020; Scroll : b:=$0010; Alt : b:=$0008; Ctrl : b:=$0004; LShift : b:=$0002; RShift : b:=$0001; end; if (mem[0:$417] and b)=b then GetLockKey:=true else GetLockKey:=false; end; Аналогично можно анализировать и байт по адресу Seg040:$18 (Keyboard Status Flags #2) Ячейка Seg0040:$0018: <-+---- номера битов є7+6+5+4+3+2+1+0| |i|c|n|s|p|q|A|^| Бит Знач. Назначение бита Іd+d+d+d+-+d+l+l| N | | | | | | | +-. 0: 01h нажат левый Ctrl | | | | | | +---. 1: 02h нажат левый Alt | | | | | +-----. 2: 04h SysReq DOWN | | | | +-------. 3: 08h hold/pause state | | | +---------. 4: 10h нажат ScrollLock | | +-----------. 5: 20h нажат NumLock | +-------------. 6: 40h нажат CapsLock +---------------. 7: 80h нажат Insert Посмотрите на прилагаемый тест, попробуйте нажать несколько клавиш сразу, обратите внимание на то, что статус клавиатуры изменяется как при нажатии на клавиши, так и при отпускании тоже!