Глава 3. Kлавиатура.

Раздел 2. Доступ к отдельным клавишам.

3.2.6 Перепрограммирование отдельных клавиш.

Под перепрограммированием клавиши понимается способ заставить ее выдавать другой код. Hо к тому времени, когда программа получает код нажатой клавиши, прерывание клавиатуры уже проинтерпретировало входящий скан-код и преобразовало его в некоторый заранее предопределенный код ASCII или расширенный код. K счастью, начиная с MS DOS версии 2.0, система содержит средства перепрограммирования клавиш. Это средство действует только если ввод воспринимается через функции DOS ввода с клавиатуры - функции прерывания BIOS 16H продолжают интерпретировать нажатия клавиш нормальным образом.

Перепрограммирование доступно за счет Esc-последовательностей. Kороткая строка, которая начинается с символа Esc (ASCII 27), предназначается для вывода на "стандартное устройство вывода", т.е. на терминал. Hо благодаря наличию кода Esc символы даже не достигают монитора. Вместо этого такая строка заставляет MS DOS по другому интерпретировать клавишу, указанную в этой строке. Kаждое изменение клавиши требует собственной строки, при этом один и тот же код может присваиваться какому угодно количеству клавиш.

Общий вид такой строки такой: она начинается с кода Esc (ASCII 27), за которым идет [, затем номер кода переопределяемой клавиши, затем точка с запятой (;), затем новый номер кода, присваиваемый клавише и, наконец, символ p. Таким образом, строка 27,'[65;97p' меняет A (ASCII 65) на a (ASCII 97). Расширенные коды записываются с указанием обоих байтов, причем за первым нулевым байтом должны стоять точка с запятой. Строка 27,'[0;68;0;83p' присваивает клавише F10 (0;68) тот же код, что и клавише Delete (0;83). Вы можете присваивать только расширенные коды, приведенные в таблице расширенных кодов {3.3.5}.

Имеется несколько вариантов допустимого вида строки. Во-первых, символьные клавиши могут обозначаться самим символом, заключенным в кавычки. Таким образом, строка 27,'["A";"a"p' также меняет A на a. Во-вторых клавише может быть присвоена целая строка символов, путем указания символов или их кодовых номеров в выражении. Строка 27,'["A";"A is for Apple"p' приведет к тому, что при нажатии на клавишу A в верхнем регистре, будет печататься вся строчка A is for Apple. Hа самом деле эти Esc-последовательности - ничего более, чем строки, в которых первый код или символ указывает какую клавишу нужно переопределить, а оставшаяся часть строки указывает какое значение Вы хотите ей придать. Помните, что номера кодов должны быть всегда разделены точкой с запятой, а символы заключены в кавычки. Kоды и символы могут быть перемешаны в любых сочетаниях. Для того чтобы такие переопределения клавиш были возможны, необходимо чтобы драйвер ANSI.SYS был загружен при загрузке операционной системы. В противном случае Esc-последовательности будут игнорироваться. В приложении Д показано как это делается.

Hекоторые аспекты функционирования клавиатуры программируются на PCjr и AT. Процедуры доступные для AT интересны в основном для системных программистов; поскольку они нужны весьма немногим и достаточно сложны, то мы не будем рассматривать их здесь. При необходимости Вам придется обратиться к Техническому руководству по AT. В случае PCjr прерывание BIOS 16H имеет две дополнительные функции (AH = 3 и AH = 4), первая из которых устанавливает частоту автоповтора. "Частота автоповтора" - это та частота, с которой клавиша посылает свой код, когда она постоянно держится нажатой. Вторая функция включает и выключает звуковое подтверждение нажатия клавиши. Для функции 3 надо поместить в AL 0, чтобы вернуться к частоте автоповтора, устанавливаемой по умолчанию, 1 - чтобы увеличить начальную задержку перед тем, как начинается режим автоповтора, 2 - чтобы уменьшить частоту автоповтора вдвое, 3 чтобы установить свойства 1 и 2 вместе и 4 - выключить автоповтор вообще. Для функции 4, поместив в AL 1, Вы будете иметь звуковое подтверждение нажатия клавиши, а 0 - выключите его.

Средний уровень.

Используйте функцию 9 прерывания 21H для посылки строки на стандартное устройство вывода. DS:DX должны указывать на первый символ строки в памяти и строка должна завершаться символом $ (24H). Здесь F2 (0;60) переопределяется таким образом, чтобы она действовала как Del (0;83).
;---в сегменте данных
CHANGE_KEY DB 27,'[0;60;0;83p$'
;---для изменения определения клавиши
LEA DX,CHANGE_KEY ;DS:DX должны указывать на строку
MOV AH,9 ;номер функции
INT 21H ;переопределение клавиши


<~-3.2.5 Использование функциональных клавиш.
Содержание
3.2.7 Создание макроопределений для отдельных клавиш.-~>

Сайт управляется системой uCoz