|
Листинг 4-6 прове-
ряет используемую клавишу при каждом прерывании от таймера. Если
первый код клавиши в буфере клавиатуры соответствует используемой
клавише, новая TSR удаляет код клавиши и активизирует TSR. |
програмное обеспечение |
|
|
В про-
тивном случае новая ISR обращается к первоначальной программе об-
работки прерываний от таймера.
Листинг 4-6. Использование прерывания Int 1ch
для опроса клавиатуры
----------------------------------------------------------------
HotKey DW (?) ; определение нажатой клавиши
; заметим, что ascii
; не может быть расширена
OldInt1c DD 0 ; запоминание старого адреса ISR
NewInt1c PROC FAR ; новый таймер isr
puch ax ; необходимо для int 16h
xor al,al ; xor быстрее очищает al,чем
inc al ; mov al,1
int 16h ; проверка буфера клавиатуры
jz NoHotKey ; если z - буфер пустой
cmp ax,HotKey ; не пустой -- нажатая клавиша?
jnz NoHotKey ; если nz -- клавиша не нажата
xor al,al ; al <== запрос чтения
int 16h ; удаление нажатой клавиши
call ActivateTSR; обращение к TSR
- 4-12 -
NoHotKey pop ax ; восстановление ax
jmp cs:OldInt1ch; передача отметки времени
NewInt1c ENDP
----------------------------------------------------------------
При использовании этого метода доступен только первый символ
буфера клавиатуры. |
операционные системы windows |
|
{img3} |
операционные системы windows |
|
Распознавание присутствия обычного символа
спрячет от этой подпрограммы опроса горячий ключ. Предполагая,
что пользователь никогда заранее не в состоянии предвидеть запро-
сы программ на ввод, горячий ключ будет обеспечивать ожидаемую
реакцию при как угодно частом обращении. |
программы архиваторы |
|
|
1с бухгалтерия, антивирус, avast antivirus, Архиваторы, архиватор win rar, .
словарь
|
Большинство хорошо работающих приложений ис-
пользуют это прерывание для ввода с клавиатуры. Установка собс-
твенного прерывания int 16h ISR позволит Вам анализировать каждый
символ и отклонять любые горячие ключи. Листинг 4-5 демонстрирует
типичную замену для int 16h ISR.
Листинг 4-5. Замена прерывания int 16h для просмотра
используемых клавиш
----------------------------------------------------------------
OldInt16 DD 0 ; сохранение кода инициализации
; адрес первоначальной isr
Hotkey DW (?) ; определение нажатой клавиши
NewInt16 PROC FAR
cmp ah,1 ; проверка функции
jg DoShift ; если g -- сдвиг
jl DoRead ; ah=0 ==> чтение
DoStatus: ; ah=1 ==> проверка состояния
pushf ; моделирование int 16
call cs:OldInt16 ; передача запроса BIOS
pushf ; сохранение флагов
cmp ax,HotKey ; найдена нажатая клавиша?
jnz Done1; нет
xor ax,ax; ah <== 0 (запрос чтения)
call cs:OldInt16 ; удаление нажатой клавиши
call ActivateTSR ; нажатая клавиша вызывает TSR
mov ah=1 ; ah <== 1 (запрос состояния)
jmp SHORT DoStatus ; повторение запроса
DoRead:
pushf ; моделирование int 16h
call cs:OldInt16
cmp ax,HotKey ; найдена нажатая клавиша?
jnz Done0 ; если nz - нет
call ActivateTSR ; нажатая клавиша вызывает TSR
xor ah,ah ; ah <== 0 (запрос чтения)
jmp SHORT DoRead ; повторение запроса
DoShift: ; передача запроса
jmp cs:OldInt16; старая ISR. Сброс
Done0: ; ax имеет не используемые флаги
- 4-11 -
iret ; возврат для вызова
Done1: ; ax имеет символ
popf ; восстановление флагов int 16h
ret 2 ; отбрасывание флагов, смоделированных
; командой int и возврат
NewInt16 ENDP
----------------------------------------------------------------
Новая int 16h ISR проверяет результаты каждого считывания
(AH=0) и запроса о состоянии буфера (AH=1), но не осуществляет
проверку состояния shift запросов (AH=2). Если код ROM-BIOS воз-
вращает горячий ключ, новая ISR удаляет код клавиши из буфера
клавиатуры, инициирует TSR, и повторяет запрос. Если только пер-
вый символ буфера клавиатуры оказывается горячим ключом , ISR не
повторяет запрос. Этот пример сделан при упрощающем предположе-
нии, что реактивация резидентной программы будет безопасной.
(Подробное обсуждение этой темы смотри в разделе "Реактивация,
архитектура DOS и сервис". Следовательно, коды в листинге 4-5 яв-
ляются только моделью, и не совсем корректны).
Ограничение для этого метода заключается в том, что горячий
ключ можно выявить только один раз, когда программа переднего
плана задает считывание. Если эта программа производит большой
объем вычислений, то между временем нажатия клавиши и ответом TSR
задержка может быть большая.
Опрос буфера клавиатуры прерыванием от таймера Int 1Ch
Вы можете обеспечить постоянный контроль клавиатуры подменой
прерывания от таймера и проверкой буфера клавиатуры с помощью Ва-
шей программы обработки прерываний от таймера.
|
|
|