Catty , вот тебе для коррекции int9h, (программа Volvo).
Она работает но PrtScr ей не поймаешь, потому что в порт не пишется эта клавиша..
Код
uses dos, crt;
Var
wasPrtScr: boolean; {признак нажатия принтс скрина}
do_exit: boolean;{признак нажатия esc}
Old_09: Pointer; {указатель на старую процедуру обработки}
KbdIntVec: procedure;{процедура - старый обработчик прерывания}
{$f+}
Procedure New9; Interrupt; {новая процедура обработки прерывания}
Var
Scan: Byte;{скэн код клавиши}
Begin
Scan := Port[ $60 ]; {читаем скэн код из порта клавы}
{ вот тут должна быть проверка на скэн-код PrtScr }
wasPrtScr := (Scan = $14); {это не работает}
do_exit := (scan = $01); { Это - Escape }
{ If wasPrtScr Then
Else} Begin
Inline( $9C ); {сохраняем регистры}
KbdIntVec; {вызываем стандартный обработчки}
End;
End;
{$f-}
var
k:byte;
BEGIN
GetIntVec($9, @KbdIntVec); {получаем вектор прерывания}
GetIntVec($9, Old_09); {и указатель}
SetIntVec($9, Addr(New9)); {ставим свой обработчик}
repeat
if wasPrtScr then
begin
writeln('Print Screen pressed');
wasPrtScr := false;
end;
if keypressed then {нажата клавиша}
begin
k:=ord(readkey); {читаем клавишу}
if k=0 then begin k:=ord(readkey); writeln('ext: ',k) end else writeln(chr(k));
end;
until do_exit;
SetIntVec($9, Old_09); {ставим старый вектор прерывания, убирая свой}
END.
Я тут посмотрел, и нашел как отличить CTRL+ALT+DEL..
вот так:
Код
procedure MyInt9; far; assembler;
asm
push ax
in al,60h
cmp al,53h {Є« ўЁи Del}
jne @Exit
push ds
xor ax,ax
mov ds,ax
mov al,ds:[417h]
and al,0Ch
cmp al,0Ch {Ctrl+Alt ?}
jne @No
in al,61h
mov ah,al
or al,80h
out 61h,al
xchg ah,al
out 61h,al
mov al,20h
out 20h,al
pop ds
pop ax
iret
@No:
pop ds
@Exit:
pop ax
push seg JmpFar
push Offset JmpFar
end;
А клоню я к тому, что тебе к нашим ассемблерщикамнадо