الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]سؤال عن عمل Sendmessage

مغلق
بدأه _- محمد نور -_ في 30 أبريل 2009 · 8 رد · 1,518 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

حياكم الله

الدالة SendMessage

أريد أن أعلم ماذا تفعل بالضبط

الذى فهمته عنها أنها ترسل رسائل للنظام

طيب مالذي يستقبلها بالضبط هناك (فى النظام يعنى)

و كيف يعلم أن هذه القيمة التى فى الرسالة لها هذا المدلول بعينة

لو أن أحد يفسر لى عملها بإختصار أكون شاكر جدا لها :D

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#2

SendMessage ترسل رسالة لنافذة معينة وتقوم باستدعاء الاجراء الخاص بالنافذة .

LRESULT SendMessage(		  HWND hWnd,
	UINT Msg,
	WPARAM wParam,
	LPARAM lParam
);

hWnd : مقبض خاص بالنافذة التي سترسل اليها الرسالة .

Msg : نوع الرسالة نفسها ، عادة ستجد جميع الرسائل في MSDN تبدأ بـWM_Xxx .

wParam ، lParam : بارامترين لتزويد الرسالة بمعلومات اضافية .

مثال :

لدينا مقبض لنافذة ونريد تغيير النص الخاص بها ، سيتم ذلك عن طريق ارسال WM_SETTEXT لهذه النافذة :

SendMessage(
	hWnd,					  // Window handle
	WM_SETTEXT,				// Message ID
	0,						 // This parameter is not used in WM_SETTEXT
	TEXT("Just a new caption") // Our new window text
);

تم تعديل هذه المشاركة بواسطة GamingMasteR في 30 أبريل 2009 في 16:54

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

الآن كيف استقبل هذه الرسائل ؟

في اجراء النافذة الأم يتم عمل switch للـMessageId والتعامل مع كل رسالة كما تريد ولا تنسى تحديد قيمة الـreturn ، ستجد معلومات اكثر على MSDN :

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CREATE:
		// Creating, allocate your needed resources ...
		break;
	case WM_PAINT:
		// Paint procedure
		break;
	case WM_DESTROY:
		// Closing, free your resources ...
		break;
	default:
		// Unhandled window message, return false to let the default window procedure handle it
		return FALSE;
	}
	// Window message handled, return TRUE
	return TRUE;
}

تم تعديل هذه المشاركة بواسطة GamingMasteR في 30 أبريل 2009 في 17:02

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

جزاك الله خيرا

الأن إتضح جزئيا عملها

طيب أفهم من هذا أنها ترسل رسائل لنوافذ فقط

يعنى الhWnd خاص بالنافذة التى سوف أرسل لها هذا الأمر ؟

و ليس لها أى إستخدام أخر إذن غير هذا

ظننت أنها ترسل رسائل للsystem

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#5

بالضبط .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

أحب أضيف توضيح صغير بعد الشرح الممتاز ل GM

GamingMasteR كتب:
Msg : نوع الرسالة نفسها ، عادة ستجد جميع الرسائل في MSDN تبدأ بـWM_Xxx .

ليس فقط رسائل ال WM_Xxx فهناك رسائل ال *M_Xxx مثل BM_ ، EM_ ..........الخ

ملاحظة أخرى بعض الرسائل لا تقبل الارسال من SendMessage ، بل فقط للاستقبال مثل WM_DEVICECHANGE والتي تدل على تغير في حالة بعض الاجهزة مع الجهاز مثل الفلاش ديسك

(تقصدت ذكر هذه الرسالة لأنها قريبة من System)

ويمكن ملاحظة ذلك في شرح MSDN للرسالة وذلك كالتالي :

LRESULT CALLBACK WindowProc(
  HWND hwnd,	   // handle to window
  UINT uMsg,	   // message identifier
  WPARAM wParam,   // device-change event
  LPARAM lParam	// event-specific data
);

نور (محمد نور) كتب:
و كيف يعلم أن هذه القيمة التى فى الرسالة لها هذا المدلول بعينة

النظام يقارن القيمة مع القيم المخزنة لديه والمشروحة في MSDN

#7
اقتباس
ملاحظة أخرى بعض الرسائل لا تقبل الارسال من SendMessage ، بل فقط للاستقبال مثل WM_DEVICECHANGE والتي تدل على تغير في حالة بعض الاجهزة مع الجهاز مثل الفلاش ديسك

بل يمكن ارسالها عن طريق SendMessage ، SendMessage لا تقوم باختبار نوع الرسالة وحجبه الا في حالات نادرة لكن استخدامنا للرسالة يتوقف على نوعها هي .

فمن الممكن ان تقوم بارسال WM_DEVICECHANGE الى برنامج تقوم بعمل محاكاة لجزء يتعامل معه من الهاردوير مثلا ولن يعترض النظام .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8

كلامك صحيح ،ولكن لم أعبر بالمصطلحات الصحيحة فلم أقصد بلا تقبل أي ان الكود الداخلي للدالة SendMessage يمنع مثل هذه الرسائل

انما ما كنت اعنيه اذا كان الهدف ارسال مثل هذه الرسائل للنظام ليقوم هو بعمل معين وليس لاجراء نافذة فالنظام سيطنش

وكما قلت أنت يمكن استخدامها لأعمال وهمية كالمحاكاة ، ولكن في الحقيقة لم يحدث حدث حقيقي .

أما بارسال WM_SETICON للنافذة فإن النظام سيستجيب بوضع وعرض ايقونة في هذه النافذة

وبالأغلب رسائل WM ذات طابع Notification أي انها بالاغلب معدة للاستقبال أكثر من الارسال

(وال WindowProc يجب ان لا يحتوي الا على الرسائل من نوع WM فقط للتعامل مع أحداث النظام ، أي لاستقبال أحداث النظام يجب وضع فقط رسائل WM عند عمل switch للـMessageId ) غير متأكد تماما من هذه العبارة.

ملاحظة أخي GM هذا الكلام ليس موجه لك بقصد أنك لا تعرف هذه الامور انما مُداخلة وللتصحيح ان كان هناك خطأ.

تم تعديل هذه المشاركة بواسطة AND في 2 مايو 2009 في 15:54

#9
اقتباس
(وال WindowProc يجب ان لا يحتوي الا على الرسائل من نوع WM فقط للتعامل مع أحداث النظام ، أي لاستقبال أحداث النظام يجب وضع فقط رسائل WM عند عمل switch للـMessageId ) غير متأكد تماما من هذه العبارة.

صحيح أغلب الرسائل التي يتم عمل handling لها تكون من عائلة WM_Xxx ، لالتقاط وعمل handling للرسائل الاخرى - مثل الخاصة بـcontrol معين مثلا - يتم عمل subclassing عادة .

اقتباس
ملاحظة أخي GM هذا الكلام ليس موجه لك بقصد أنك لا تعرف هذه الامور انما مُداخلة وللتصحيح ان كان هناك خطأ.

ما انت عارف وانا عارف ، بس كله علشان خاطر المشاهد :D

ومفهاش حاجة لو معرفش وقلتلي يعني :)

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…