// 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;
|