PDA

View Full Version : اجرای برنامه هنگام خاموش شدن



MBeigy
جمعه 27 تیر 1382, 06:44 صبح
سلام خدمت همگی
کسی از دوستان میتونه بگه که چطور میشه یه برنامه رو درست مثل استارت آپ، ولی موقع خاموش شدن دستگاه اجرا کرد؟

مهدی کرامتی
جمعه 27 تیر 1382, 10:58 صبح
در ویندوز چنین امکانی وجود ندارد، اما میتوان اینکار را با یک حقه انجام داد.
به اینصورت که یک برنامه بصورت رزیدنت در حافظه باشد (در حال اجرا باشد، اما عکس‌العمل خاصی تا زمان موردنظر انجام ندهد). برای انجام اینکار ابتدا برای جلوگیری از اعمال ناخواسته مانند بسته شدن برنامه توسط کاریر بهتر است فرم اصلی برنامه را مخفی کنید. برای انجام اینکار در پروسیجر OnCreate فرم اصلی از این دستور استفاده کنید:
Application.ShowMainForm:=False;
در صورتی که بخواهید آنرا از لیست Task List نیز حذف کنید میتوانید از رویه زیر استفاده کنید:
//Add this code in interface section of your unit.
const
RSPSIMPLESERVICE = 1;
RSPUNREGISTERSERVICE = 0;

function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord;
stdcall; external 'KERNEL32.DLL';

// In implementation section, where you need to HIDE from TASK LIST (Ctrl-Alt-Del LIST)
// call following command:
RegisterServiceProcess(GetCurrentProcessID, RSPSIMPLESERVICE);

// And call this to re-appear in the TASK LIST
RegisterServiceProcess (GetCurrentProcessID, RSPUNREGISTERSERVICE);


حالا برسیم به اصل ماجرا:
در روال OnCloseQuery فرم اصلی، کد موردنظری که میخواهید هنگام خروج از ویندوز اجرا شود را بنویسید.
هنگام بسته شدن یک فرم این پروسیجر بصورت اجباری اجرا میشود. وقتی ویندوز میخواهد Shutdown کند یک Message به تمام Process های در حال اجرا میفرستد و به آنها دستور میدهد به اجرای خود خاتمه دهند. برنامه شما نیز هنگام دریافت آن Message و بستن فرم مربوطه این پروسیجر آن فرم را اجرا میکند. نکته جالب اینستکه تا زمانی که شما اجازه بسته شدن را برای این فرم صادر نکنید ویندوز Shutdown نخواهد شد. چه جوری؟
اینجوری که پروسیجر OnCloseQuery یک پارامتر بنام CanClose دارد. اگر شما مقدار False به این پارامتر بدهید فرم شما از بسته شدن توسط ویندوز امتناع خواهد کرد مگر اینکه بصورت اجباری توسط تابع KillProcess ویندوز بسته شود. در هر صورت چنین کدی منظور شما را تامین خواهد کرد:
CanClose:=False;
// do some stuff here
If some_condition then CanClose:=True;
(در صورت نیاز کد فوق را در پروسیجر OnCloseQuey فرم اصلی وارد کنید.)

همین!

خوش باشید.

MBeigy
جمعه 27 تیر 1382, 21:37 عصر
سلام دلفی اسیستنت عزیز
دقیقا گرفتم که چیکار باید بکنم. ممنون. :P