PDA

View Full Version : سوال: جلوگیری از دریافت پیغام توسط برناممون



Mask
جمعه 30 اردیبهشت 1390, 21:31 عصر
با سلام.
چطوری باید پیغام wm_close و wm_quiet رو از برنامه حذف کنیم.
یعنی وقتی این دوتا پیغام به برنامه رسید ، برنامه عکس العملی نشون ندههد.
فکر کنم باید هندلش کنم... اما کدوم پیغام رو هندل کنم نمیدونم و چطوری مقدار nul بدم به این پیغام.
ممنون.

یوسف زالی
جمعه 30 اردیبهشت 1390, 22:31 عصر
سلام.
یک TApplicationEvents رو فرم بذار و تو OnMessage کد زیر رو بنویس:



if Msg.message = WM_LButtonDown then
Handled := true;



Handled یعنی خودم هندلش کردم و کاری با این پیغام نداشته باش.

SAASTN
جمعه 30 اردیبهشت 1390, 22:51 عصر
برای هندل کردن WM_CLOSE کافیه متد زیر رو برای فرم اصلیتون بازنویسی کنید:
procedure WMClose(var Message: TWMClose); message WM_CLOSE;
حالا اگه توش inherited رو نیارید یا در شرایط خاصی فراخونی کنید دیگه برنامه بسته نمیشه.
اما در مورد WM_QUIT نمی دونم دقیقا چیکار میشه کرد، اگه به پیاده سازی TApplication.ProcessMessages توی یونیت Forms نگاه کنید می بینید که در اون دقیقا ذکر شده که اگر Msg.Message مخالف WM_QUIT بود رویداد OnMessage فراخونی بشه و ... توی راهنما دلفی هم گفته این پیام با هیچ پنجره ای در ارتباط نیست و بنابراین در هیچیک از روال های مربوط به پنجره های ویندوز دریافت نمیشه و فقط توسط PeekMessage دریافت میشه که اونم تو یکی از DLLهای ویندوز پیاده سازی شده.

vcldeveloper
شنبه 31 اردیبهشت 1390, 15:00 عصر
کافیه از رویداد OnMessage شی Application استفاده بشه، یا Window procedure مربوط به اون پنجره override بشه (متد WndProcرو میشه override کرد) یا اینکه با استفاده از SetWindowLong اون پنجره Subclass بشه. از نظر اولویت، پیام ارسالی به یک برنامه اول در رویداد OnMessage قابل پردازش هست، بعدا در متد WndProc، و نهایتا توسط custom message handler هایی مثل WmClose.

البته هندل کردن پیام هایی مثل WM_CLOSE یا WM_QUIT مانع بسته شدن پروسه شما نمیشه، و میشه به راحتی با تابع TerminateProcess، اون پروسه رو بست!

SAASTN
شنبه 31 اردیبهشت 1390, 19:02 عصر
از نظر اولویت، پیام ارسالی به یک برنامه اول در رویداد OnMessage قابل پردازش هست، بعدا در متد WndProc، و نهایتا توسط custom message handler هایی مثل WmClose.
خوب مسئله همینه دیگه، WM_QUIT تو همون ProcessMessages بلوکه میشه و اصلا کار به OnMessage و غیره نمیرسه.

اصلا آقای Gold شما از کجا این پیامو درک کردی؟ جایی باهاش برخورد داشتی یا بر اساس مستندی چیزی باهاش آشنا شدی؟

Mask
شنبه 31 اردیبهشت 1390, 19:49 عصر
اصلا آقای Gold شما از کجا این پیامو درک کردی؟ جایی باهاش برخورد داشتی یا بر اساس مستندی چیزی باهاش آشنا شدی؟
با تشکر از همه عزیزان.
منظورتون از پیام WM_QUIT هست؟