[Back to KEYBOARD SWAG index]  [Back to Main SWAG index]  [Original]

(*
:Could someone please tell me how to disable CTRL-BREAK/C in my program so the
:user cannot exit without using my "exit" option?  The DOS BREAK=OFF just

The mother of all TP FAQs :-)

-From: garbo.uwasa.fi:/pc/ts/tsfaqp20.zip Frequently Asked TP Questions
-Subject: Disabling or capturing the break key

1. *****
 Q: I don't want the Break key to be able to interrupt my TP
programs. How is this done?
 Q2: I want to be able to capture the Break key in my TP program.
How is this done?
 Q3: How do I detect if a certain key has been pressed?

 A: This very frequently asked question is basically a case of RTFM
(read the f*ing manual). But this feature is, admittedly, not very
prominently displayed in the Turbo Pascal reference. (As a general
rule we should not use the newsgroups as a replacement for our
possibly missing manuals, but enough of this line.)
   There is a CheckBreak variable in the Crt unit, which is true by
default. To turn it off use
     uses Crt;
     :
     CheckBreak := false;
     :
Besides turning off break checking this enables you to capture the
pressing of the break key as you would capture pressing ctrl-c. In
other words you can use e.g.
     :
procedure TEST;
var key : char;
begin
  repeat
    if KeyPressed then
      begin
        key := ReadKey;
        case key of
          #3 : begin writeln ('Break'); exit; end;  {ctrl-c or break}
          else write (ord(key), ' ');
        end; {case}
      end; {if}
  until false;
end;
     :
IMPORTANT: Don't test the ctrl-break feature just from within the TP
IDE, because it has ctlr-break handler ("intercepter") of its own
and may confuse you into thinking that ctrl-break cannot be
circumvented by the method given above.
  The above example has a double purpose. It also shows the
rudiments how you can detect if a certain key has been pressed. This
enables you to give input without echoing it to the screen, which is
a later FAQ in this collection.
  This is, however, not all there can be to break checking, since
the capturing is possible only at input time. It is also possible to
write a break handler to interrupt a TP program at any time. For
more details see Ohlsen & Stoker, Turbo Pascal Advanced Techniques,
Chapter 7. (For the bibliography, see FAQPASB.TXT in this same FAQ
collection).

 A2: Here is an example code for disabling Ctrl-Break and Ctrl-C
with interrupts
*)
  uses Dos;
  var OldIntr1B : pointer;  { Ctrl-Break address }
      OldIntr23 : pointer;  { Ctrl-C interrupt handler }
      answer    : string;   { For readln test }
  {$F+}
  procedure NewIntr1B (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
            Interrupt;
  {$F-} begin end;
  {$F+}
  procedure NewIntr23 (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
            Interrupt;
  {$F-} begin end;
  begin
    GetIntVec ($1B, OldIntr1B);
    SetIntVec ($1B, @NewIntr1B);   { Disable Ctrl-Break }
    GetIntVec ($23, OldIntr23);
    SetIntVec ($23, @NewIntr23);   { Disable Ctrl-C }
    writeln ('Try breaking, disabled');
    readln (answer);
    SetIntVec ($1B, OldIntr1B);    { Enable Ctrl-Break }
    SetIntVec ($23, OldIntr23);    { Enable Ctrl-C }
    writeln ('Try breaking, enabled');
    readln (answer);
    writeln ('Done');
  end.

[Back to KEYBOARD SWAG index]  [Back to Main SWAG index]  [Original]