Получение состояния переключающих клавиш
На входе: AH = 02h
На выходе: AL = Байт состояния переключающих клавиш
Функция возвращает в регистре AL состояние переключающих клавиш (Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock, Ins). Формат байта состояния соответствует формату байта, находящегося в области данных BIOS по адресу 0000h:0417h:
Биты Значение
0 Нажата правая клавиша Shift.
1 Нажата левая клавиша Shift.
2 Нажата комбинация клавиш Ctrl-Shift с любой стороны.
3 Нажата комбинация клавиш Alt-Shift с любой стороны.
4 Состояние клавиши ScrollLock.
5 Состояние клавиши NumLock.
6 Состояние клавиши CapsLock.
7 Состояние клавиши Insert.
Функция может быть использована для анализа текущего состояния переключающих клавиш.
Изменим текст предыдущей программы таким образом, чтобы завершение ее работы происходило лишь в том случае, если переключающая клавиша CapsLock находится в выключенном состоянии (соответствующий светодиод не горит):
#include <stdio.h> #include <dos.h>
void main(void);
void main(void) {
union REGS rg; int i, zflag;
for(;;) {
// Выводим в цикле символ '*'
putchar('*');
// Небольшая задержка во времени
for(i=0; i<1000; i++);
// Вызываем прерывание INT 16h для проверки буфера клавиатуры
// Устанавливаем флаг, который будет сброшен при нажатии на // любую клавишу
zflag = 1;
_asm {
mov ax, 0100h int 16h
// Если нажатия не было, // продолжаем выполнение программы
jz nokey
// При нажатии на любую клавишу // сбрасываем флаг
mov zflag, 0 nokey:
}
if(zflag == 0) {
// Если флаг сброшен, читаем код нажатой клавиши из буфера // при помощи функции 01h прерывания INT 16h
rg.h.ah = 0; int86(0x16, &rg, &rg);
// Если была нажата клавиша ESC, завершаем работу программы, // при условии, что переключатель CapsLock выключен
if(rg.h.ah == 1) {
// Дополнительно проверяем состояние клавиши CapsLock, // этой клавише соответствует бит 0x40 в слове состояния
rg.h.ah = 2; int86(0x16, &rg, &rg);
if((rg.h.al & 0x40) == 0) break;
else printf("\nДля завершения нажмите" " ESC " "при выключенной клавише CapsLock.\n"); } else printf("\nДля завершения нажмите ESC " "при выключенной клавише CapsLock.\n"); } } }
На входе: AH = 12h.
На выходе: AL = Байт состояния переключающих клавиш.
Функция возвращает в регистре AL состояние переключающих клавиш (Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock, Ins):
Биты Значение
0 Нажата левая клавиша Shift вместе с Ctrl. 1 Нажата левая клавиша Shift вместе с Alt. 2 Нажата правая клавиша Shift вместе с Ctrl. 3 Нажата правая клавиша Shift вместе с Alt. 4 Нажата клавиша ScrollLock. 5 Нажата клавиша NumLock. 6 Нажата клавиша CapsLock. 7 Нажата клавиша SysReq.
Функция 12h аналогична функции 02h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу и имеет другой формат байта состояния.
Эта функция определена для BIOS, изготовленной не раньше 15 декабря 1985 года.