Здравствуйте. Хочу заменить стандартный обработчик клавиатуры на свой.При нажатии комбинации Левый и правый Shift+F1 - вызвать свой обработчик клавиатуры, который дает звуковой сигнал, и при нажатии цифры "2" (block_symb:=Port[$60]) блокирует ее нажатие ( if (block_symb=$31) and (block=1) then begin port[$61]:=$8; delay(200); port[$20]:=$20; end; ) Нажатие Shift определяю след. образом: Перый и второй бит по адресу 0:0417. sh:=mem[$0000:$0417]; if (sh AND $2)=1 then {выделяем левый Shift } if (sh and $1)=1 then {выделяем правый Shift} then tr:=true; {признак нажатия - true} Делаю все, как нужно. Пересмотрел все справочники. Но программа никак не определяет нажатие Shift. А вот весь текст программы. {$M $800,0,0} program z2; uses dos,crt; var old_key:procedure; symb,block_symb,sh,ct_right,block:integer; r:registers; tr:boolean; c:char; procedure new_keyboard; interrupt; {$F+} begin sh:=mem[$0000:$0417]; if (sh AND $02)=1 then if (sh and $01)=1 then tr:=true; symb:=PORT[$60]; if tr and (symb=$3b) then begin sound(150); delay(250); nosound; block:=block XOR 1; old_key; block_symb:=Port[$60]; if (block_symb=$31) and (block=1) then begin port[$61]:=$8; delay(200); port[$20]:=$20; end; end else inline($9c); old_key; end; {$F-} begin block:=1; GetIntVec($09,@old_key); Setintvec($09,@new_keyboard); keep(0); end. Может у кого-нибудь есть РАБОТАЮЩАЯ программа, связанная с обработчиком клавиатуры? Интересно,почему моя не работает.
структура байта по адресу 0:0417 такая: [I|C|N|S|a|c|sL|sR|] sR - расположен на нулевом бите. Если он установлен в "1", значит нажат правый Shift, sL - 1, нажат левый шифт, с -1 , нажат один из CTRL a - 1, нажат один из Alt (sh AND $2)=1 - это логическое умножение.....По идее должна получиться единица, если шифт нажат
x AND 2 никогда не равно 1. Результат будет либо 2 либо 0. тебе надо if( (sh AND 3)<>0 ) then shift_нажат;
да. Теперь она распознает нажатие Шифта, но при включении режима (нажатии горячих клавиш) даже звукового сигнала нет. Может я процедуру неправильно объявил?
Я имею в виду,что при нажатии Shift+shift+F1 , появляется "16 разрядная подсистема MS-DOS. Процессор NTVDM обнаружил недопустимую инструкцию CS:0002 IP:0354 OP: d9 e7 0f 00 00". uses dos,crt; var old_key:procedure; symb,block_symb,sh,ct_right,block:integer; r:registers; tr:boolean; c:char; procedure new_keyboard; interrupt; {F+} begin sh:=mem[$0000:$0417]; if ((sh AND 2)<>0) then if ((sh and 1)<>0) then tr:=true; symb:=PORT[$60]; if ( tr and (symb=$3b)) then begin sound(150); delay(1050); nosound; block:=block XOR 1; old_key; block_symb:=Port[$60]; if (block_symb=$31) and (block=1) then begin port[$61]:=$8; delay(200); port[$20]:=$20; end; end else inline($9c); old_key; end; {$F-} begin block:=1; GetIntVec($09,@old_key); Setintvec($09,@new_keyboard); while true do begin read(c); writeln(c); end; end.