View Full Version : دستور SendMessage چه کارایی دارد؟
SYNDROME
جمعه 27 اردیبهشت 1387, 11:44 صبح
با سلام
می خواستم بدانم SendMessage بیشتری برای چه کاری استفاده می شود و پارامترهای ورودی چه تاثیری بر روند اجرای آن دارد؟
جستجو کردم ولی چیزی پیدا نکردم.
با تشکر
Touska
جمعه 27 اردیبهشت 1387, 12:08 عصر
How do Windows messages get sent? Some messages are sent by Windows itself to instruct the window to do something or to notify the window that something has happened. At other times, messages are sent by the programmer or, in the case of VCL, by the framework the programmer is using. Regardless of who is sending the messages, you can be guaranteed that a lot of messages are flying around at any given millisecond.
Message Types
Basically, messages fall into two categories:
Command messages--Cause something to occur either in Windows or within a particular control.
Notification messages--Sent by Windows to notify you that something has happened.
To illustrate the difference between these two types of messages, let's take a look at the standard edit control. The standard Windows edit control has almost 80 command messages and nearly 20 notification messages. Surprised? It's true, and don't forget that the edit control is just one control out of dozens of Windows controls.
برای مثال شما با استفاده از این ارسال دستور می تونید طول یک متن را در EditBox یا همون Edit بدست آورید :
int start;
int end;
long result = SendMessage(hWndEdit, EM_GETSEL, 0, 0);
start = LOWORD(result);
end = HIWORD(result);
int length = end - start;که همان در دلفی خورمون میشه :
Length := Edit.SelLength;حالا اگر شما بخواهید به برنامه که ماله خودتون نیست ارسال دستور کنید یا مثلا Click در آن
برنامه انجام بشه باید از SendMessage ها استفاده نمایید.
امیدوارم منظور منو گرفته باشید ، بر گرفته از Tech Your Self Delphi از انتشارات Sams
SYNDROME
جمعه 27 اردیبهشت 1387, 14:53 عصر
با تشکر از Touska دوست عزیز
تا حدودی متوجه منطورتان شدم.
می خواستم بدانم این دستور چهار تا پارامتر دارد که باید مقدار به آنها پاس شود.
این چهارتا پارامتر چه مفاهیمی دارد؟
چطور می توانم لیست پارامترها و نوع عملی که آنها انجام می دهند را به دست آورد؟
مثلاً این دستور چه کار می کند
Const
PBM_SETMARQUEE = WM_USER+ 10;
Var
FMarquee: Boolean;
FAnimationTime: Integer;
SendMessage(Handle, PBM_SETMARQUEE, Integer(FMarquee), FAnimationTime);
با تشکر از دوستان
vcldeveloper
جمعه 27 اردیبهشت 1387, 15:27 عصر
پارامتر اول Handle پنچره ایی هست که باید پیام را دریافت کنه.
پارامتر دوم خود پیام هست.
پارامترهای سوم و چهارم (lparam, wparam) پارامترهای مربوط به پیام هستند که از طریق آنها در هنگام ارسال پیام داده هایی به پنجره ارسال، یا داده ایی از پنجره دریافت میشه. کاربردشان را خود پیام مشخص میکنه. مثلا پیامی مثل WM_CLOSE هیچ پارامتری نیاز نداره، برای همین هم پارامترهای سوم و چهارم بصورت 0 ارسال میشند، اما پیامی مثل WM_Paint نیاز داره که مقدار DC (Device Context) رو هم داشته باشه، برای همین هم در راهنماش نوشته شده که مقدار wParam آن باید برابر با مقدار hDC پنجره مربوطه باشه. یا مثلا WM_GETTEXT از wParam برای ارسال تعداد کارکترها، و از lParam برای آدرس بافری که باید کارکترها درش قرار بگیرند استفاده میکنه. پس برای مقدار wParam و lParam باید به راهنمای خود پیام مراجعه کنید.
نکته دیگه ایی هم که ممکن هست بعدا بپرسید، فرق SendMessage با PostMessage هست:
SendMessage وقتی پیامی ارسال میکنه، منتظر میمونه تا پیام توسط گیرنده پردازش بشه، اما PostMessage پیام را به صف پیام های پنجره گیرنده ارسال میکنه و بالافاصله بر می گرده، یعنی منتظر نمیشه که اون پنجره پیام را پردازش کنه. این حالت بخصوص برای پیام هایی که جنبه Notification دارند، بیشتر بکار میاد.
SYNDROME
جمعه 27 اردیبهشت 1387, 18:23 عصر
با تشکر از علی کشاورز که واقعا کامل توضیح داد.
فقط علی جان نگفتید دستوری که در بالا من نوشتم چه مفهومی دارد و چه کار می کند؟
برای مقدار wParam و lParam باید به راهنمای خود پیام مراجعه کنید.
منظورتان از راهنما همان Help دلفی است و یا مرجع دیگری نیاز دارم؟
با تشکر فراوان
موفق باشید
vcldeveloper
شنبه 28 اردیبهشت 1387, 02:02 صبح
منظورتان از راهنما همان Help دلفی است و یا مرجع دیگری نیاز دارم؟پیام های ویندوز در Windows SDK توضیح داده شدند. با راهنمای دلفی یک نسخه از Windows SDK هم نصب میشه که از طریق منوی Help در دسترس هست. علاوه بر اون، می تونید از MSDN هم استفاده کنید.
نگفتید دستوری که در بالا من نوشتم چه مفهومی دارد و چه کار می کند؟کدی که شما نوشتید، پیام PBM_SETMARQUEE را به یک پنجره ارسال میکنه، اما نمیشه درباره اش بیشتر از این چیزی گفت، چون این یک پیام ویندوز نیست بلکه خود برنامه نویس این پیام را تعریف کرده:
Const
PBM_SETMARQUEE = WM_USER+ 10;
شما می تونید با SendMessage و PostMessage پیام هایی غیر از پیام های ویندوز هم ارسال کنید. مثلا خود VCL برای کنترل بعضی از امور خود از پیام های خاص خودش استفاده میکنه. در کد شما هم برنامه نویس خودش یک پیام خاص ایجاد کرده و آن را به یک پنجره ارسال میکنه. البته فقط پیام درست کردن نیست، پنجره ایی هم که پیام را دریافت میکنه، باید بداند اون پیام چی هست و چه رفتاری در قبال آن باید انجام بشه. در کد شما هم، حتما برنامه نویس در کد مربوط به پنجره دریافت کننده پیام، روالی برای بررسی دریافت پیام PBM_SETMARQUE و بررسی آن فراهم کرده.
B-Vedadian
شنبه 28 اردیبهشت 1387, 08:02 صبح
ممنون از توضیحات جناب کشاورز.
کد بالا به یک پنجره از نوع Progress Bar میگه که حرکت چرخشی رو انجام بده و یا متوقف بمونه(FMarquee) و فاصله به روز کردن تصویر Progress Bar چند میلی ثانیه باشه(FAnimationTime).
SYNDROME
شنبه 28 اردیبهشت 1387, 08:44 صبح
با تشکر از دوستان
کد بالا به یک پنجره از نوع Progress Bar میگه که حرکت چرخشی رو انجام بده و یا متوقف بمونه(FMarquee) و فاصله به روز کردن تصویر Progress Bar چند میلی ثانیه باشه(FAnimationTime).
همانطور که آقای کشاورز گفت این پیام را باید به پنجره دیگر هم که پیام را می گیرد شناساند.
شما این پیام را از کجا به دست آورید که چنین کاری را انجام می دهد؟
با تشکر
B-Vedadian
شنبه 28 اردیبهشت 1387, 09:59 صبح
تو MSDN بگردید پیداش میکنید...
vcldeveloper
شنبه 28 اردیبهشت 1387, 15:45 عصر
نمی دونستم کنترل های ویندوز هم برای پیام های خودشون از مقادیری که برای User رزرو شده استفاده می کنند، برای همین تصور کردم که با توجه به WM_USER + 10 ، پیام توسط خود برنامه نویس ساخته شده و یک Message Handler براش نوشته شده.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.