Bilgisayarın Kapatılmak istendiğini anlamak ve engel olmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Bilgisayarın Kapatılmak istendiğini anlamak ve engel olmak

Mesaj gönderen vkamadan »

Merhaba,
Bazı durumlarda veri tabanı sunucusu olarak kullanılan makina sorgusuz sualsiz normal yöntemlerle kapatılıyor (bilgisayarı kapat komutu uygulanarak) tabi server üzerindeki VT ye bağlı çalışan kullanıcılarda askıda kalıyorlar bu durumu engellemek için ana makinada yazıcağımız bir windows servis uygulamasının bilgisayarın kapatılması istenildiğinde bir takım kontroller yaparak gerekirse kapatmayı engellemesi, bu mümkün olabilirmi acaba?
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

WM_ENDSESSION
WM_QUERYENDSESSION
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

@bluekid merhaba,
WM_QUERYENDSESSION mesajı sanırım oturum kapatılmadan önce yayınlanıyor, peki ben bu durumda oturum kapatılmasını nasıl engelleyebilirim biraz daha açabilirmisiniz rica etsem.Teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Kodları denemedim ama örnek vermek gerekirse:

Kod: Tümünü seç

.
.
.
  private
    { Private declarations }
    procedure WMQueryEndSession(var Msg : TWMQueryEndSession);message WM_QUERYENDSESSION;
  public
.
.
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  //inherited;
  //Msg.Result := 1;
  Msg.Result := 0; //bu değer 1 mi yoksa 0 mı olacak onu hatırlayamadım
end;
inherited satırını silersen ve Msg.Result değerini 0 (yoksa 1 miydi hatırlayamıyorum) yaparsan oturum kapanamıyor olması lazım. İyi çalışmalar bol denemeler.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

@sabanakman,
Çok teşekkür ederim, verdiğiniz örnek çalışıyor.
İyi çalışmalar diliyorum.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Volkan kardeş yazacağın böyle bir programı/servis kodunu paylaşmak istersen biz de seve seve bekleriz :) Çünkü dediğin gibi kullanıcı bazında program açıkken ya da veri tabanı kapatılmadan işlerin yarıda kalması söz konusu olabilir. Böyle bir kontrol veri güvenliğini bir kademe daha artıracaktır :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

Bu vesileyle biz de öğrenmiş olduk.
Sorana ve Cevaplayana Teşekkürler.;)
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Recep abi elbette paylaşırım, düm fırsatım olmadı bugün yazılımını yapıp örneğide buraya atıyorum,
Kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

The WM_QUERYENDSESSION message is sent when the user chooses to end the Windows session or when an application calls the ExitWindows function.If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.
After processing this message, Windows sends the WM_ENDSESSION message with the wParam parameter set to the results of the WM_QUERYENDSESSION message.
Kodu @sabanakman vermiş
windows oturum kapatılırken yada windowstan çıkışta bütün açık -çalışmakta olan programlara- WM_QUERYENDSESSION mesajıyla haber gönderir. Her hangi bir program yok kapanmasın derse - 0 değeri göndererek - kapanış durur. WM_QUERYENDSESSION mesajının sonucuda WM_ENDSESSION ile uygulmalara bildirir.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Evet @sabanakman kodu paylaştı, bende bir servis örneği yapıp koyarım die düşündüm fakat kendi içimde yaptığım denemelerde, normal windows application olarak yaptığım denemelerde mesaj yakalanıp işlem başarıyla gerçekleşirken servis içinde mesajı aynı şekilde yakalayamıyorum,
Şu şekilde kullanmaya çalışıyorum,

Kod: Tümünü seç

unit udeneme_servis;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TDeneme = class(TService)
    procedure ServiceExecute(Sender: TService);
  private
  procedure WMQueryEndSession(var Msg : TWMQueryEndSession);message WM_QUERYENDSESSION;
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Deneme: TDeneme;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Deneme.Controller(CtrlCode);
end;

function TDeneme.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TDeneme.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
   inherited;
   Msg.Result := 0;
   ShowMessage('Windowsun kapandığı algılandı.');
end;

procedure TDeneme.ServiceExecute(Sender: TService);
begin
while not Terminated do
ServiceThread.ProcessRequests(True);
end;

end.
Hizmetlerde başlamış olarak görüyorum , fakat bilgisayarı kapatırken herhangi bir mesaj yakalama işi yapmıyor.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla