[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]