PDA

View Full Version : تشخیص پارامتر ارسالی ویندوز برای خروج از سیستم عامل



persia_hrn
سه شنبه 12 شهریور 1392, 21:20 عصر
سلام دوستان

من برنامه ای نوشتم که به محض Kill شدن دوباره اجرا میشه و توی وضعیت قبلی برنامه قرار میگیره ، فقط یه مشکل دارم اونم اینکه وقتی برنامه اجرا میشه دیگه ویندوز خارج نمیشه یعنی ریست ، خاموش و لاگ آف و ... نمیشه .

میدونم که پارامتر ارسالی ویندوز رو باید کنترل کنم که اگه دستور بستن برنامه توسط ویندوز برای خارج شدن ارسال شد برنامه رو ببندم تا ویندوز به کار خارج شدنش ادامه بده ولی این اتفاق نمی افته ، برنامه دستور ویندوز رو تشخیص میده و بسته میشه و دیگه اجرا نمیشه ولی ویندوز خارج نمیشه .

حالا بعد از این همه داستانی که تعریف کردم میخوام بدونم راهی هست که برنامه تشخیص بده دستور خروج ویندوز مربوط به ریسیته یا خاموش شدن و یا سوئیچ یوز و ... ؟
اینو واسه این میخوام که برنامه خودش خروج از ویندوز رو انجام بده .

قابل توجه آقای Gold :
1- برای کنترل kill شدن برنامه از یک برنامه جانبی استفاده میکنم که همزمان با برنامه اصلی اجرا میشه .
2- از دستور CanClose توی فرم برنامه استفاده میکنم و یک شرط هم برای اون میذارم که هروقت نیاز بود به راحتی فرم بسته بشه .

Mask
سه شنبه 12 شهریور 1392, 21:34 عصر
عزیز جان گفتم بهت که برای این کار نیاز به تشخیص برنامه شما نیست.
با کد زیر هم کار CanClose رو انجام میدی و هم سیستم راحت عملیات مورد نظرشو انجام میده.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=GetSystemMetrics($2000)<>0;
end;
اگه خیلی هم اصرار داری که برنامت این مدل پیشغامها رو بگیره میتونی یه مسیج هندلر بنویسی :

private
procedure WMQueryEndSession(var Msg: TWMQueryEndSession);
message WM_QueryEndSession;
procedure WMEndSession(var Msg: TWMEndSession);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BTN_1Click(Sender: TObject);
var
shell: Variant;
begin
shell := CreateOleObject('Shell.Application');
shell.ShutdownWindows;
end;

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 TForm1.WMEndSession(var Msg: TWMEndSession);
begin
if Msg.EndSession = TRUE then
ShowMessage('Windows is shutting down ' + #10#13 + 'at ' +
FormatDateTime('c', Now));
inherited;
end;