[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]
{
WILBERT VAN LEIJEN
> HEy, I have been using some routines to check if certain keys are pressed,
> but I can't figure out how to test For ALT and CTRL key combinations.
}
{$G+}
Uses
  Dos, Crt;
Var
  KeyHandlerProc : Procedure;
  Int15Vector    : Pointer;
Const
  AltStatus  : Array [Boolean] of String[5] = ('     ', ' ALT ');
  CtrlStatus : Array [Boolean] of String[6] = ('      ', ' CTRL ');
Procedure KeyHandler; Far;
Var
  AltKey  : Boolean;
  CtrlKey : Boolean;
  WhereXY : Record
    x, y : Byte;
  end;
begin
  AltKey  := False;
  CtrlKey := False;
  Asm
    MOV AH, 2
    INT 16h
    CMP AL, 8
    JNE @1
    INC [AltKey]
   @1:
    CMP AL, 4
    JNE @2
    INC [CtrlKey]
   @2:
  end;
  WhereXY.x := WhereX;
  WhereXY.y := WhereY;
  GotoXY(66, 25);
  Write(AltStatus[AltKey], ' ', CtrlStatus[CtrlKey]);
  GotoXY(WhereXY.x, WhereXY.y);
end;  { KeyHandler }
{ This INT 15h handler is called every time a key is pressed -
  provided you're not running this Program on an XT-class machine }
Procedure TrapKeyboard; Assembler;
Asm
  PUSH   BX
  PUSH   DS
  PUSHF
  MOV    BX, SEG @Data
  MOV    DS, BX
  CMP    AH, 4Fh
  JNE    @ChainInt15
  PUSH   ES
  PUSHA
  CALL   [KeyHandlerProc]
  POPA
  POP    ES
 @ChainInt15:
  PUSHF
  CALL   [Int15Vector]
  POPF
  POP    DS
  POP    BX
  IRET
end;  { TrapKeyboard }
begin
  GetIntVec($15, Int15Vector);
  KeyHandlerProc := KeyHandler;
  SetIntVec($15, @TrapKeyboard);
  ReadLn;
  SetIntVec($15, Int15Vector);
end.
[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]