// In Foren wird häufig die Frage gestellt, wie das Abfangen von Alt+F4
// funktioniert, bzw. wie das Schließen des Programms verhindert werden kann.
// Hier einige Möglichkeiten:


// Getestet mit D4 unter Win98
// (Möglichkeit 6 getestet mit D4 unter XP)

//--------------------

// 1. Möglichkeit

var erlaubt: boolean = false; 
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
  canclose := erlaubt; 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  erlaubt := true;
  close; 
end;

// Diese Methode hat den Nachteil, dass sogar Windows selbst nicht beendet
// werden kann, solange
canclose=false ist.

//--------------------

// 2. Möglichkeit

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  keypreview := true; 
end; 
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
begin 
  if (key = $73) and (shift = [ssalt]) then key := 0; 
end; 

// Hierbei ist es aber immer noch möglich, über den Button bzw. durch
// Doppelklick auf das Icon in der Titelleiste das Fenster zu schließen.
// Es wir nur Alt+F4 abgefangen.

//--------------------

// 3. Möglichkeit

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  SetClassLong(handle, gcl_style, cs_noclose); 
end; 

// Hiermit ist es nur noch möglich, das Programm durch einen
// Doppelklick auf das Icon in der Titelleiste abzubrechen.

//--------------------

// 4. Möglichkeit

procedure TForm1.FormCreate(Sender: TObject); 
var h: THandle; 
begin 
  h := GetSystemMenu(handle, false); 
  EnableMenuItem(h, sc_close, mf_grayed); 
  SetClassLong(handle, gcl_style, cs_noclose); 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  close; 
end;

// Hiermit wird der Menueintrag "Schließen" zusätzlich deaktiviert.
// Das Schließen des Fenster muss auf anderem Wege (z.B. Button) erfolgen.

//--------------------

// 5. Möglichkeit

procedure TForm1.FormCreate(Sender: TObject); 
var h: THandle; 
begin 
  h := GetSystemMenu(handle, false); 
  RemoveMenu(h, sc_close, mf_bycommand); 
  SetClassLong(handle, gcl_style, cs_noclose); 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  close; 
end; 

// Bei dieser Methode, wird der Menüeintrag "Schließen" komplett entfernt.


//--------------------

// 6. Möglichkeit
// bei Windows XP bleibt aber immernoch die Möglichkeit das Programm über
// die Taskleiste zu schließen. Hier muss man die Möglichkeit 1. einsetzen.
// Damit aber Windows nicht blockiert wird, muss man sie etwas abwandeln:
 

type 
  TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
  private 
    procedure WindowsEnd(var aMsg: TWMQueryEndSession); message WM_QUERYENDSESSION; 
  public 
    { Public-Deklarationen } 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.DFM} 
 
var 
  CloseFlag: boolean = false; 
 
procedure TForm1.WindowsEnd(var aMsg: TWMQueryEndSession); 
begin 
  CloseFlag := true; 
  inherited; 
end; 
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
  CanClose := CloseFlag; 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  CloseFlag := true; 
  close; 
end;

 

Zugriffe seit 6.9.2001 auf Delphi-Ecke