PDA

View Full Version : تشخیص عملیات Shutdown , Reboot و logoff



persia_hrn
پنج شنبه 08 دی 1390, 19:16 عصر
با سلام .
چطور یک برنامه میتونه تشخیص بده که کامپیوتر در حال خاموش شدن یا ریست و در کل در حال خروج از سیستم هست ؟
البته میدونم که این کارها با فایلهای Shutdown.exe , Reset.exe و logoff.exe که توی شاخه ی system32 ویندوز وجود دارن انجام میشه .

lord_viper
پنج شنبه 08 دی 1390, 21:07 عصر
خب وقتی ویندوز میخواهد خاموش بشه یه پیغام WM_QUERYENDSESSION به همه برنامه های در حال اجرا ارسال میکنه و بعد از تایید همه برنامه ها برای خاموش شدن یک پیغام WM_ENDSESSION به همه برنامه ها ارسال میشه شما با مانیتور کردن این پیغامها درون برنامتون میتونین این رفتار رو تشخیص بدین

این یه نمونه کد البته به دلفی هست احتمالا کمکتون میکنه



~~~~~~~~~~~~~~~~~~~~~~~~~
procedure WMQueryEndSession
(var Msg : TWMQueryEndSession) ;
message WM_QueryEndSession;
~~~~~~~~~~~~~~~~~~~~~~~~~

procedure TForm1.WMQueryEndSession
(var Msg : TWMQueryEndSession) ;
begin
if MessageDlg('Close Windows ?',
mtConfirmation,
[mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1 ;
end;
~~~~~~~~~~~~~~~~~~~~~~~~~

Procedure WMEndSession
(var Msg : TWMEndSession) ;
message WM_ENDSESSION;
~~~~~~~~~~~~~~~~~~~~~~~~~

procedure TForm1.WMEndSession
(var Msg : TWMEndSession) ;
begin
if Msg.EndSession = TRUE then
ShowMessage('Windows is shutting down ' + #10#13
+ 'at ' + FormatDateTime('c', Now)) ;
inherited;
end;

persia_hrn
پنج شنبه 08 دی 1390, 21:51 عصر
آقا دست شما درد نکنه بابت راهنماییتون ، خیلی خوب و OK بود .
مرسی . :تشویق:

Mask
شنبه 10 دی 1390, 13:09 عصر
خب وقتی ویندوز میخواهد خاموش بشه یه پیغام WM_QUERYENDSESSION به همه برنامه های در حال اجرا ارسال میکنه و بعد از تایید همه برنامه ها برای خاموش شدن یک پیغام WM_ENDSESSION به همه برنامه ها ارسال میشه شما با مانیتور کردن این پیغامها درون برنامتون میتونین این رفتار رو تشخیص بدین

این یه نمونه کد البته به دلفی هست احتمالا کمکتون میکنه



~~~~~~~~~~~~~~~~~~~~~~~~~
procedure WMQueryEndSession
(var Msg : TWMQueryEndSession) ;
message WM_QueryEndSession;
~~~~~~~~~~~~~~~~~~~~~~~~~

procedure TForm1.WMQueryEndSession
(var Msg : TWMQueryEndSession) ;
begin
if MessageDlg('Close Windows ?',
mtConfirmation,
[mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1 ;
end;
~~~~~~~~~~~~~~~~~~~~~~~~~

Procedure WMEndSession
(var Msg : TWMEndSession) ;
message WM_ENDSESSION;
~~~~~~~~~~~~~~~~~~~~~~~~~

procedure TForm1.WMEndSession
(var Msg : TWMEndSession) ;
begin
if Msg.EndSession = TRUE then
ShowMessage('Windows is shutting down ' + #10#13
+ 'at ' + FormatDateTime('c', Now)) ;
inherited;
end;

ممنون از شما دوست عزیز.
چطوری میشه این پیغام رو بگیریم . اما به سیستم اجازه ریست شدن ندیم.
البته میدونم با هوک. اما نمیدونم چطوری باید پیاده سازی بشه.
در ضمن در نظر داشته باشید که در ویندوز سون امکان ریست فورس هم وجود داره.

lord_viper
یک شنبه 11 دی 1390, 10:13 صبح
fبرای جلوگیری از این عملیاتها میتونین از یکی از کدهای زیر استفاده کنین دومی بهتره



procedure TForm1.WMQueryEndSession
(var Msg : TWMQueryEndSession) ;
begin
if MessageDlg('Close Windows ?',
mtConfirmation,
[mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1 ;
end;




function TForm25.HookEndSession(var Message: TMessage): Boolean;
begin
result := false;
if Message.Msg = WM_ENDSESSION then begin
Message.Result := 0;
result := true;
end;
end;

procedure TForm25.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(HookEndSession);
end;


چون تو اولی ممکنه بعد جلوگیری گاهی اوقات برنامتون بسته بشه


http://msdn.microsoft.com/en-us/library/ms700677%28VS.85%29.aspx

Mask
یک شنبه 11 دی 1390, 11:58 صبح
ممنون از توجهتون. اما بازم به خاطر قابلیت فورس ویندوز سون سیستم لوگ آف میشه.

persia_hrn
سه شنبه 13 دی 1390, 23:16 عصر
دوستان چطور میشه تشخیص داد که ویندوز بخاطر کدوم عمل پیغام Endsession رو میفرسته ؟
تشخیص اینکه ویندوز میخواد Shutdown بشه یا Restart یا Logoff .