Uses Dos; var ExitSave, BKDISave, BKDIHandler : Pointer; Regs : Registers; Abort : Boolean; {$F+} procedure NewCntlBreakHandler(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word); interrupt; begin inline($FA); { disable interrupts } { do nada widda data } { OR DO ANYTHING YOU WANT } inline($FB); { enable interrupts } Abort := True; { Use this for (while NOT abort do..) } end; procedure NewBKDIHandler(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word); interrupt; begin inline($FA); { disable interrupts } { do nada widda data } { OR DO ANYTHING YOU WANT } inline($FB); { enable interrupts } AX := 0; {This must remain. An oversight in Turbo Pascal.} end; procedure MyExit; begin ExitProc := ExitSave; SetIntVec($1B, BKDISave); SetIntVec($24, BKDIHandler); end; {$F-} begin ExitSave := ExitProc; ExitProc := @MyExit; Regs.AH := $35; { Get Cntl-Break Interrupt Vector } Regs.AL := $1B; Intr($21,Regs); BKDISave := Ptr(Regs.ES, Regs.BX); SetIntVec($1B, @NewBKDIHandler); Regs.AH := $35; { Get Cntl-Break Handler Interrupt Vector } Regs.AL := $23; Intr($21,Regs); BKDIHandler := Ptr(Regs.ES, Regs.BX); SetIntVec($23, @NewCntlBreakHandler); { Do whatever here. When finished, the old interrupt vectors are restored in the MyExit procedure } end.