Mega Code Archive

 
Categories / Delphi / System
 

Windows’un kapanma anının tespiti

Windows'un kapanma anının yakalanabilmesi için, Windows tarafından kapanmadan önce yayınlanan, WM_EndSession mesajı yakalanmalıdır. Mesaj yakalama yordamı, uygulama ana form sınıfının, Private bölümünde şu şekilde tanımlanır. procedure WMEndSession(var Msg : TWMEndSession); message WM_ENDSESSION; Mesaj yakalama yordamının kendisi ise, Implementation bölümünde aşağıdaki gibi yaratılır. procedure TForm1.WMEndSession(var Msg : TWMEndSession); begin if Msg.EndSession = TRUE then ShowMessage('Windows kapatılıyor. '); inherited; end; veya procedure TForm1.WMQueryEndSession(var Msg : TWMQueryEndSession); begin if MessageDlg('Windows kapansınmı ?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then Msg.Result := 0 else Msg.Result := 1; end; Windowsun kapandığını tespit eden bir bileşen kodu aşağıdadır. unit winshut; interface uses Messages, SysUtils, Classes, Forms, Windows; type TkapanmaOlayi = procedure (Sender: TObject; var TamamKapat: boolean) of object; type TSezonuKapat = class(TComponent) private FUYG: THandle; FParent: THandle; FESKIWINYORD: pointer; FYeniPencereYordami: pointer; KAPANIRKEN: TkapanmaOlayi; TamamKapat: boolean; procedure YeniPencereYordami(var MESAJ: TMessage); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Loaded; override; published property WINKAPANIS: TkapanmaOlayi read KAPANIRKEN write KAPANIRKEN; end; procedure Register; implementation constructor TSezonuKapat.Create (AOwner : TComponent); begin inherited Create(AOwner); TamamKapat := TRUE; FUYG := Application.Handle; FParent := (AOwner as TForm).Handle; FYeniPencereYordami := MakeObjectInstance(YeniPencereYordami); end; destructor TSezonuKapat.Destroy; begin SetWindowLong(FUYG, GWL_WndProc, longint(FESKIWINYORD)); FreeObjectInstance(FYeniPencereYordami); inherited Destroy; end; procedure TSezonuKapat.Loaded; begin inherited Loaded; FESKIWINYORD := pointer(SetWindowLong(FUYG, GWL_WndProc,longint(FYeniPencereYordami))); end; procedure TSezonuKapat.YeniPencereYordami(var MESAJ: TMessage); begin with MESAJ do begin if (Msg=WM_QUERYENDSESSION) then begin if Assigned(KAPANIRKEN) then KAPANIRKEN(Self,TamamKapat); if TamamKapat then Result := CallWindowProc(FESKIWINYORD, FUYG, Msg, wParam,lParam) else Result := 0; end else Result := CallWindowProc(FESKIWINYORD, FUYG, Msg, wParam,lParam); end; end; procedure Register; begin RegisterComponents('Kitap', [TSezonuKapat]); end; end.