تشرح هذه المقالة بالتفصيل كيفية حصول دلفي على المقابض وإرسال الرسائل في شكل أمثلة، وتعليمات الاستخدام المحددة هي كما يلي:
ابحث عن مقبض نافذة أخرى:
Handle := FindWindow(nil,PChar('عنوان النافذة'));// ابحث عن مقبض النموذج
البحث عن النماذج الفرعية:
ChildHandle := FindWindowEx(handle,0,'subform class','subform title');
هناك أيضًا واجهة برمجة تطبيقات لتعداد النماذج الفرعية.
EnumChildWindows(مقبض الجسم الرئيسي، وظيفة @callback، معلمات المستخدم)؛
لاستخدام هذه الوظيفة، تحتاج إلى كتابة وظيفة رد الاتصال بنفسك، مثل:
وظيفة EnumChildProc(ahWND:HWND; المعلمة:LPARAM):boolean stdcall;sendmessage(handle,message,wl,rl)
واجهة الوحدة Unit1 تستخدم Windows، الرسائل، Tlhelp32، SysUtils، Classes، Graphics، Controls، Forms، Dialogs، StdCtrls؛ type TForm1=class(TForm)procedure FormCreate(Sender: TObject); end; var Form1: TForm1;إجراء التنفيذ{ $R *.DFM}. TForm1.FormCreate(Sender: TObject);var a,b:PAnsiChar;h:HWND;beginh:= FindWindow(nil,'abc.txt - Notepad');h:= FindWindowEx(h,0,'edit', nil );SendMessage(h,WM_SETTEXT,255,Integer(PChar('أنا هنا للقياس')));ShowMessage( IntToStr(h));end;
SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); تعيين لون خلفية التلفزيون SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0); اضغط على زر الماوس الأيسر SendMessage(Button.Handle,WM_LBUTTONUP ، 0،0)؛ ارفع زر الماوس الأيسر SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar('abc'))); تمرير النص SendMessage(Edit.Handle,WM_Char,Wparam('Q'),2); SendMessage( Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1); تغيير نمط الزر SendMessage(ComboBox.Handle,CB_SETDropPEDWIDTH,300,0); تغيير CBDownWidth
يتم قص ونسخ ولصق WM_CUT وWM_COPY وWM_PASTE
تنفيذ أي مجموعة مفاتيح:
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0);keybd_event(ord('V') ، MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0);keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
وصف SendMessageA: استدعاء وظيفة النافذة الخاصة بالنافذة لإرسال رسالة إلى تلك النافذة. لا ترجع هذه الوظيفة إلا إذا تمت معالجة الرسالة
يحتوي SendMessage على 4 معلمات:
1. يمكن أن تكون نافذة مقبض النافذة hwnd 32 بت أي نوع من كائنات الشاشة، لأن Win32 يمكنه الاحتفاظ بمقابض لمعظم الكائنات المرئية
2. wMsg هي قيمة ثابتة تستخدم لتمييز الرسائل الأخرى. يمكن أن تكون هذه الثوابت ثوابت محددة مسبقًا في وحدات Windows أو ثوابت مخصصة.
3. عادة ما تكون wParam قيمة ثابتة تتعلق بالرسالة، أو قد تكون مقبض النافذة أو عنصر التحكم
4. عادةً ما يكون lParam مؤشرًا يشير إلى البيانات الموجودة في الذاكرة. نظرًا لأن WParm وlParam وPointer كلها 32 بت، فيمكن تحويلها إلى بعضها البعض.
وصف تفصيلي لوظيفة wMsg:
★WM_Create يقوم بإنشاء نافذة
★WM_DESTROY يتم إرساله عند تدمير النافذة
★WM_MOVE تحريك النافذة
★WM_SIZE تغيير حجم النافذة
★WM_ACTIVATE تم تفعيل أو إلغاء تنشيط النافذة
★WM_SETFOCUS نافذة تحصل على التركيز
★WM_KILLFOCUS نافذة تفقد التركيز
★WM_ENABLE يغير النافذة إلى حالة التمكين
★WM_SETREDRAW قم بتعيين ما إذا كان يمكن إعادة رسم النافذة
★WM_SETTEXT يرسل التطبيق هذه الرسالة لتعيين نص النافذة
★WM_GETTEXT يرسل التطبيق هذه الرسالة لنسخ نص النافذة المقابلة إلى المخزن المؤقت.
★WM_GETTEXTLENGTH الحصول على طول النص المتعلق بالنافذة (باستثناء الأحرف الخالية)
★WM_PAINT يطلب من النافذة إعادة طلاء نفسها
★WM_CLOSE يرسل إشارة عند إغلاق نافذة أو تطبيق.
★WM_QUERYENDSESSION يختار المستخدم إنهاء مربع الحوار أو يقوم البرنامج باستدعاء وظيفة ExitWindows نفسها
★يتم استخدام WM_QUIT لإنهاء تنفيذ البرنامج
★WM_QUERYOPEN عندما يتم استعادة نافذة المستخدم إلى حجمها وموضعها السابق، قم بإرسال هذه الرسالة إلى أحد الأيقونات
★WM_ERASEBKGND عندما يجب مسح خلفية النافذة (على سبيل المثال، عندما يتغير حجم النافذة)
★WM_SYSCOLORCHANGE عندما يتغير لون النظام، قم بإرسال هذه الرسالة إلى كافة النوافذ ذات المستوى الأعلى
★بعد رسالة WM_QUERYENDSESSION، يتم إرسال هذه الرسالة إلى التطبيق لإعلامه بما إذا كانت المحادثة قد انتهت أم لا.
★WM_SHOWWINDOW يتم إرسال هذه الرسالة إلى هذه النافذة عندما تكون النافذة مخفية أو معروضة.
★WM_ACTIVATEAPP يرسل هذه الرسالة إلى التطبيق أي نافذة نشطة وأيها غير نشطة.
★WM_FONTCHANGE يتم إرسال هذه الرسالة إلى كافة نوافذ المستوى الأعلى عندما تتغير مكتبة موارد الخطوط الخاصة بالنظام.
★WM_TIMECHANGE أرسل هذه الرسالة إلى كافة نوافذ المستوى الأعلى عندما يتغير وقت النظام
★WM_CANCELMODE أرسل هذه الرسالة لإلغاء الوضع المستمر (التشغيل)
★WM_SETCURSOR إذا تسبب الماوس في تحريك المؤشر في النافذة
★WM_ENDSESSION عندما لا يتم التقاط مشكلات عملية النظام وإدخال الماوس، يتم إرسال رسالة إلى النافذة.
يرسل WM_MOUSEACTIVATE هذه الرسالة إلى النافذة الحالية عندما يكون المؤشر في نافذة غير نشطة ويقوم المستخدم بالضغط على زر الماوس.
★WM_CHILDACTIVATE أرسل هذه الرسالة إلى نافذة MDI التابعة عندما يقوم المستخدم بالنقر فوق شريط عنوان هذه النافذة، أو عندما يتم تنشيط النافذة أو نقلها أو تغيير حجمها
★WM_QUEUESYNC يتم إرسال هذه الرسالة عن طريق برنامج تدريبي قائم على الكمبيوتر، ويتم فصل رسالة إدخال المستخدم بواسطة برنامج ربط WH_JOURNALPALYBACK
★WM_GETMINMAXINFO يتم إرسال هذه الرسالة إلى النافذة عندما تكون على وشك تغيير الحجم أو الموضع.
★WM_PAINTICON يتم إرساله إلى النافذة المصغرة عندما يكون الرمز الخاص بها على وشك إعادة الرسم
★WM_ICONERASEBKGND يتم إرسال هذه الرسالة إلى النافذة المصغرة فقط إذا كان من الضروري إعادة رسم خلفيتها قبل رسم الرمز.
★WM_NEXTDLGCT★أرسل هذه الرسالة إلى برنامج مربع الحوار لتغيير موضع التركيز
★WM_SPOOLERSTATUS يتم إصدار هذه الرسالة في كل مرة تتم فيها إضافة مهمة أو طرحها من قائمة انتظار إدارة الطباعة.
★WM_DRAWITEM يتم إرساله عندما يتغير المظهر المرئي للزر، ومربع التحرير والسرد، ومربع القائمة، والقائمة
★WM_MEASUREITEM عند إنشاء زر أو مربع تحرير وسرد أو مربع قائمة أو عنصر تحكم عرض القائمة أو عنصر القائمة
★WM_VKEYTOITEM تحتوي هذه الرسالة على نمط LBS_WANTKEYBOARDINPUT الذي تم إصداره لمالكها استجابة لرسالة WM_KEYDOWN
★WM_CHARTOITEM يتم إرسال هذه الرسالة بواسطة مربع قائمة أنماط LBS_WANTKEYBOARDINPUT إلى مالكها استجابة لرسالة WM_CHAR
★WM_SETFONT عند رسم النص، يقوم البرنامج بإرسال هذه الرسالة للحصول على اللون الذي سيتم استخدامه بواسطة عنصر التحكم.
★WM_GETFONT يرسل التطبيق هذه الرسالة للحصول على خط النص المرسوم بواسطة عنصر التحكم الحالي.
★WM_SETHOTKEY يرسل التطبيق هذه الرسالة لربط النافذة بمفتاح التشغيل السريع.
★WM_GETHOTKEY يرسل التطبيق هذه الرسالة لتحديد ما إذا كان مفتاح التشغيل السريع مرتبطًا بنافذة أم لا
★WM_QUERYDRAGICON يتم إرسال هذه الرسالة إلى نافذة مصغرة عندما تكون هذه النافذة على وشك السحب والإفلات ولا يوجد رمز محدد في فئتها، يمكن للتطبيق إرجاع رمز أو مقبض المؤشر يقوم المستخدم بسحب وإسقاط الرمز.
★WM_COMPAREITEM أرسل هذه الرسالة لتحديد الموضع النسبي للعناصر المضافة حديثًا في combobox أو listbox
★WM_COMPACTING يوضح أن الذاكرة منخفضة جدًا.
★WM_WINDOWPOSCHANGING أرسل هذه الرسالة إلى وظيفة setwindowpos أو وظائف إدارة النوافذ الأخرى عندما يكون حجم النافذة وموضعها على وشك التغيير.
★WM_WINDOWPOSCHANGED أرسل هذه الرسالة إلى وظيفة setwindowpos أو وظائف إدارة النوافذ الأخرى عند تغيير حجم النافذة وموضعها.
★WM_POWER يتم إرسال هذه الرسالة عندما يكون النظام على وشك الدخول في حالة الإيقاف المؤقت.
★WM_COPYDATA يتم إرسال هذه الرسالة عندما يقوم أحد التطبيقات بتمرير البيانات إلى تطبيق آخر
★WM_CANCELJOURNA عندما يقوم المستخدم بإلغاء حالة تفعيل سجل البرنامج، قم بإرسال هذه الرسالة إلى البرنامج
★WM_NOTIFY عند وقوع حدث لعنصر تحكم أو يحتاج عنصر التحكم إلى الحصول على بعض المعلومات، يتم إرسال هذه الرسالة إلى نافذته الأصلية.
★WM_INPUTLANGCCHANGEREQUEST عندما يقوم المستخدم بتحديد لغة الإدخال، أو يتغير مفتاح التشغيل السريع الخاص بلغة الإدخال
★WM_INPUTLANGCHANGE يتم إرسال هذه الرسالة إلى نافذة المستوى الأعلى المتأثرة عند تغيير مشهد النظام الأساسي.
★WM_TCARD يتم إرسال هذه الرسالة إلى التطبيق عندما يقوم البرنامج بتهيئة روتين تعليمات Windows.
★WM_HELP تظهر هذه الرسالة أن المستخدم قام بالضغط على F1. إذا تم تنشيط القائمة، فسيتم إرسال هذه الرسالة إلى القائمة المرتبطة بهذه النافذة، وإلا فسيتم إرسالها إلى النافذة مع التركيز عليها سيتم إرسال الرسالة للنافذة النشطة حاليًا
★WM_USERCHANGED يتم إرسال هذه الرسالة إلى جميع النوافذ بعد قيام المستخدم بتسجيل الدخول أو تسجيل الخروج. عندما يقوم المستخدم بتسجيل الدخول أو الخروج، يقوم النظام بتحديث معلومات الإعداد المحددة للمستخدم. يرسل النظام هذه الرسالة فورًا عندما يقوم المستخدم بتحديث الإعدادات.
★WM_NOTIFYFORMAT تستخدم عناصر التحكم العامة وعناصر التحكم المخصصة والنوافذ الأصلية الخاصة بها هذه الرسالة لتحديد ما إذا كان عنصر التحكم يستخدم بنية ANSI أو UNICODE.
دالة EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; var buffer: array[0..255] of char; begin SendMessage(hwnd,WM_GETTEXT,256,lparam); end; الإجراء TForm1.Button1Click(Sender: TObject); var hwnd: Integer; buffer: array[0..255] of char; Begin hwnd := FindWindow('CabinetWClass',nil); (hwnd,@EnumChildWindowsProc,Longint(@buffer[0])); StrPas(buffer end);