Середовище програмування MADL

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Середовище програмування MADL » Архів (чернетки) » Чернетка. Turbo Pascal. Коды клавиш


Чернетка. Turbo Pascal. Коды клавиш

Сообщений 1 страница 5 из 5

1

Чернетка. Turbo Pascal. Коды клавиш

2

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

https://aspektcenter.ru/tablitsa-kodov-klavish-pascal/

3

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 	

https://keycode.inicar.info/KeyCode/2_KeyCode_Table.php

4

Как прочитать нажатия клавиш 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
продвижение сайта

5

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

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

Вы здесь » Середовище програмування MADL » Архів (чернетки) » Чернетка. Turbo Pascal. Коды клавиш