C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Клавиатурный буфер
ZiBiT
Отправлено: 15.11.2005, 09:48


Ученик-кочегар

Группа: Участник
Сообщений: 6



Не подскажите какой функцией можно очистеть клавиатурный буфер
Grigoriy
Отправлено: 17.11.2005, 20:46


Мастер участка

Группа: Участник
Сообщений: 381



Зависит от режима работы центрального микропроцессора.
В ОС MS-DOS, например процессор работает в реальном режиме и очистка клавиатурного буфера без проблем может быть решена либо через функции BIOS вызываемые через прерывание

INT 0x16


либо через работу с регистрами клавиатуры через порты :

регистр состояния доступен для чтения через порт 0x64 командой ассемблера
(под ОС windows этот код скорее всего работать не будет
причина — у прикладной программы низкий уровень привилегий)
CODE

asm{
in al, 0x64;
};

Нулевой бит — в этом регистре — признак наличия данных в выходном буфере
CODE

asm{
pushad;//все регистры общего назначения процессора в стек
@@loop1:
in al, 0x64;//статус клавиатуры в регистр al процессора
test al, 1;/*бит регистра al с номером 0 равен 1 ? Если да — бит ZF регистра флагов процессора устанавливается в 0, если нет — в 1*/
jz @@pusto;//проверяем бит ZF регистра флагов процессора. Если 1 — //переход на метку
.......//тут присутствуют команды ассемблера, выполняющиеся, если
.......//не пусто
in al, 0x60;//читаем scan-cod нажатой клавиши в регистр al процессора
.......
jmp @@loop1;//повторяем попытку чтения из буфера
@@pusto:
.......//тут присутствуют команды ассемблера, выполняющиеся, если
.......//пусто
@@end:
.......
.......
popad;//все регистры общего назначения процессора из стека
};


В ОС Windows процессор работает в защищенном режиме и прикладной программе операционная система назначает низкий уровень привилегий — некоторые команды процессора недоступны,
в том числе и инструкции чтения и записи в порты.
Адреса прерываний BIOS переназначаются.
Прерывание 0x16 BIOS-а для работы с клавиатурой мне использовать не удалось.

Отредактировано Grigoriy — 17/11/2005, 21:01
AVC
Отправлено: 18.11.2005, 09:05


Ветеран

Группа: Модератор
Сообщений: 1583



Скорее всего ZiBiT интересовало как очистить очередь событий клавиатуры для данного приложения. Для этого я отлавливал все сообшения приложению и НЕ обрабатывал клавиатурные. (Естественно все о оформлено в одну функцию AppKeyClr smile.gif ).

Вернуться в Вопросы программирования в C++Builder