'@' : реакция на нажатие клавиши F1;

'[' : реакция на нажатие клавиши Esc;

'A' : реакция на нажатие обычной клавиши A

end; {case}

<p>21.4. Опрос служебных клавиш</p>

Под служебными клавишами понимаются все клавиши редактирования, TAB, Enter(Return) и Esc. Их объединяет полное отсутствие системы в возвращаемых кодах. Достаточно взглянуть на табл. 21.1, чтобы увидеть это. Однако никакие принципиальные изменения в процедуры опроса вносить не придется — вполне сгодится алгоритм из предыдущего раздела. Надо только внимательно писать процедуры анализа возвращаемых символов и не забывать

- 502 -

анализировать флаг расширенных кодов. Советуем также посмотреть разд. 21.6 о скэн-кодах клавиш.

<p>21.5. Анализ клавиш регистров и их состояния</p>

К клавишам регистров относятся клавиши Alt, Shift, Ctrl, а также переключатели Ins, CapsLock, NumLock, ScrollLock и т.п. Все они отличаются тем, что, будучи нажаты, сами по себе они не возвращают никаких символов. Это значит, что нельзя определить, нажата ли клавиша регистра или отпущена (если другие клавиши при этом не нажимаются) при помощи стандартных процедур ввода-вывода.

Регистровые клавиши при нажатии устанавливают определенные биты фиксированных байтов системной памяти MS-DOS. В полностью совместимых с IBM PC ПЭВМ таких байтов два. Они имеют адреса $0000:$0417 и $0000:$0418 (адреса даны в шестнадцатеричном формате).

В байте $417 каждый бит имеет свое значение: 1 — если режим включен или комбинация клавиш нажата, и 0 в противном случае. На рис. 21.6 и 21.7 приведены расшифровки битов состояния клавиатуры. Справа от таблиц указаны десятичные значения весов соответствующих битов. Значение байта $417 или $418 равно сумме весов ненулевых битов.

Вес -- Бит -- Байт 0:$417

1 -- 0 -- Нажата правая клавиша Shift

2 -- 1 -- Нажата левая клавиша Shift

4 -- 2 -- Нажата клавиша Ctrl

8 -- 3 -- Нажата клавиша Alt

16 -- 4 -- Отмена прокрутки (ScrollLock)

32 -- 5 -- Регистр цифр (NumLock)

64 -- 6 -- Регистр букв (CapsLock)

128 -- 7 -- Режим вставки/замещения (Ins)

Рис. 21.6

Байт $418 содержит указатели на состояние самих клавиш режимов. Если соответствующий бит содержит 1, то клавиша в момент опроса нажата.

Биты 0...2 имеют смысл только на 101-клавишной клавиатуре. В противном случае они считаются зарезервированными и не используются.

- 503 -

Вес -- Бит -- Байт 0:$418

1 -- 0 -- 1 если нажаты Ctrl + Shift

2 -- 1 -- 1 если нажаты Alt + Shift

4 -- 2 -- Зависит от типа ПЭВМ и клавиатуры

8 -- 3 -- Зависит от типа ПЭВМ и клавиатуры

16 -- 4 -- 1 если нажата ScrollLock

32 -- 5 -- 1 если нажата NumLock

64 -- 6 -- 1 если нажата CapsLock

128 -- 7 -- 1 если нажата Ins

Рис. 21.7

Если же клавиатура имеет специальный контроллер на 101 клавишу, то содержимое бита $418 будет немного другим. Лучше не использовать различающиеся биты, чтобы не терять переносимость программ.

На рис. 21.8 приведен текст программы, с помощью которой можно посмотреть на изменения битов при нажатиях клавиш регистров.

| USES CRT; { ФУНКЦИЯ ПРЕДСТАВЛЕНИЯ ЧИСЛА В ДВОИЧНОМ ВИДЕ}

| FUNCTION Binary(X : Longint; NumOfBits : Byte) : String;

| VAR

| bit, i : Byte; { вспомогательные переменные }

| s : String[32];

| BEGIN

| s:=''; { обязательная чистка строки }

| for i:=0 to 31 do begin { цикл перевода }

| bit := ( X shl i ) shr ( 31 ); { выделение бита }

| s := s + Chr( Ord( '0' ) + bit ) { запись в строку }

| end; (for) { конец цикла }

| { Оставляем в строке лишь NumOfBits битов справа: }

| Delete( s, 1, 32-NumOfBits );

| Binary := s { возвращаемая строка }

| END;

| VAR

| M:Byte absolute $000:$417; { можно изменить на $418 }

| BEGIN

| ClrScr;

| CheckBreak := True; { разрешить прерывание }

| Repeat

| WriteLn( M:10, ' ', Binary( M, 8 ) );

| until False { условие вечного цикла }

| END.

Рис. 21.8

- 504 -

После запуска программы нажимайте на клавиши Shift, Ctrl, Alt, CapsLock, NumLock, Ins и смотрите за состоянием битов. Закончить работу программы можно лишь нажав Ctrl+Break.

Зная значения битов, легко управлять состоянием фиксированных режимов и опрашивать регистры и их клавиши. Библиотека процедур и функций, управляющих регистрами клавиатуры, может иметь вид, показанный на рис. 21.9.

| TYPE { типы клавиш режимов }

| КеуТуре = ( Ins, Caps, Num, Scroll );

| {функция возвращает True, если включен режим xxxLock.}

| FUNCTION GetLockKey( Lock : КеуТуре ) : Boolean;

| VAR Bit : Byte;

| BEGIN

| case Lock of

Перейти на страницу:

Поиск

Похожие книги