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 ). |
|