"نموذج الاختطاف": كما يوحي الاسم، فهو عبارة عن سحب نماذج تطبيقات أخرى أو حتى برامج النظام إلى شكل هذا البرنامج حيًا. هذا النوع من "الاختطاف" القسري دون موافقة البرامج الأخرى يمكن أن يلعب دورًا فريدًا جدًا في مواقف معينة. تتناول هذه المقالة تقنية نموذج "الاختطاف" وتطبيقه، وتعطي مثالاً لبرنامج "قطاع الطرق" الكامل.
من الناحية الفنية، من أجل تنفيذ "الاختطاف"، يجب أن يكون هناك كائن MDIForm في برنامج "السارق".
الشرط الثاني لتحقيق "الاختطاف" هو أن تعرف مقبض النموذج "المخطوف". ليس من الصعب القيام بذلك. على سبيل المثال، عندما ينزلق الماوس على الشاشة، يمكننا استخدام وظيفة API GetCursorPos للحصول على إحداثيات الموضع الحالي لمؤشر الماوس، ثم استخدام وظيفة API أخرى WindowFromPoint للحصول على مقبض نافذة النقطة المحددة. أو استخدم FindWindow للحصول على مقبض النافذة.
مع الشرطين المذكورين أعلاه، يمكن لبرنامج "السارق" البدء في تنفيذ "الاختطاف": استخدم أولاً أمر GW_CHILD لوظيفة API GetWindow للعثور على مقبض النافذة الفرعية الأولى للبرنامج، ثم استخدم وظيفة API أخرى SetParent إلى "اختطاف" يحدد نموذج "اختطاف" "والدًا جديدًا"، وهو مؤشر للنافذة الفرعية أعلاه. على الفور، كان لدى الشكلين غير المرتبطين في الأصل علاقة "الأب والابن": ظهرت النافذة "المختطفة" داخل النموذج "السارق"!
2. سلامة “الاختطاف”
إن "الاختطاف" العشوائي أمر خطير للغاية. ومع ذلك، يمكن ضمان السلامة طالما تم اتباع المبدأين التاليين:
أولاً، قبل إغلاق برنامج "السارق"، استخدم وظيفة SetParent "لتحرير" النموذج "المختطف"، أي استعادة "الأب" الأصلي للشخص "المختطف".
ثانياً، لا "تختطف" نافذة النظام. تشتمل نوافذ النظام بشكل عام على: نافذة شريط المهام، النافذة التي يتم إنشاؤها بالضغط على "ابدأ"، النافذة التي يتم إنشاؤها بالضغط على "Ctrl+Alt+Del"، النافذة التي يتم إنشاؤها عن طريق النقر بزر الماوس الأيمن، وما إلى ذلك.
تُستخدم تقنية "الاختطاف" على نطاق واسع في لغة VB، على سبيل المثال، يمكن وضع عناصر التحكم داخل عناصر التحكم في الحاوية أثناء تشغيل البرنامج (مثل تعيين زر كنافذة فرعية لصورة أو عنصر تحكم في النموذج)، أو نقل عناصر التحكم من الحاوية. إلى آخر في النموذج.
شفرة:
محددة في القطاع الخاص من النموذج
hwndOldParent:HWND;
hwndNotePad:HWND;
قم بتعيين FormStyle للنافذة على fsMDIForm
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
hwndNotePad:=FindWindow(PChar('Notepad'),0);
hwndOldParent:=GetParent(hwndNotePad);
Windows.SetParent(hwndNotePad,handle);
نهاية؛
الإجراء TForm1.FormDestroy(Sender: TObject);
يبدأ
Windows.SetParent(hwndNotePad,hwndOldParent);
نهاية؛
لمزيد من المعلومات، يرجى الاطلاع على: http://lincosoft.go.nease.net/