2.4.3. Получение состояния переключающих клавиш
На входе: 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");
}
}
}
- Клавиатура
- 2.1. Принципы работы клавиатуры
- 2.2. Порты для работы с клавиатурой
- 2.3. Аппаратное прерывание клавиатуры
- 2.4. Средства bios для работы с клавиатурой
- 2.4.1. Чтение символа с ожиданием
- 2.4.2. Проверка буфера на наличие в нем символов
- 2.4.3. Получение состояния переключающих клавиш
- 2.4.4. Установка временных характеристик клавиатуры
- 2.4.5. Запись символов в буфер клавиатуры
- 2.4.6 Чтение символа с ожиданием для 101-клавишной клавиатуры
- 2.4.7. Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- 2.4.8. Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- 2.5. Средства ms-dos для работы с клавиатурой
- 2.5.1. Буферизованный ввод с эхо-выводом
- 2.5.2. Буферизованный ввод без эхо-вывода
- 2.5.3. Нефильтрованный ввод без эхо-вывода
- 2.5.4. Ввод/вывод на консоль
- 2.5.5. Ввод строки символов
- 2.5.6. Проверка состояния стандартного ввода
- 2.5.7. Сброс буфера клавиатуры
- 2.6. Клавиатурные функции библиотеки Microsoft c
- 2.6. Драйвера режима ядра для ps/2 клавиатуры Стек драйверов для системных устройств ввода
- Стек драйверов для Plug and Play ps/2-клавиатуры
- Стек устройств для Plug and Play ps/2-клавиатуры
- Обработка клавиатурного ввода приложениями Поток необработанного ввода (получение данных от драйвера)
- Обработка сообщений конкретным окном
- Массивы состояния клавиш клавиатуры
- Клавиатурные ловушки
- Общая схема обработки
- Модель прямого ввода (Raw Input)