التعليقات

ربط الماوس لالتقاط الأحداث خارج تطبيق

ربط الماوس لالتقاط الأحداث خارج تطبيق

تعرّف على كيفية تتبع نشاط الماوس حتى عندما لا يكون تطبيق Delphi نشطًا أو يجلس في الدرج أو لا يحتوي على أي واجهة مستخدم على الإطلاق.

من خلال تثبيت ربط ماوس على مستوى النظام (أو عالمي) ، يمكنك مراقبة ما يفعله المستخدم بالماوس والتصرف وفقًا لذلك.

ما هو الخطاف وكيف يعمل؟

باختصار ، الخطاف هو وظيفة (رد اتصال) يمكنك إنشاؤها كجزء من مكتبة الارتباط الحيوي (DLL) أو تطبيقك لمراقبة "الأحداث" داخل نظام التشغيل Windows.
هناك 2 أنواع من السنانير - العالمية والمحلية. يربط الخطاف المحلي الأشياء التي تحدث فقط لبرنامج محدد (أو سلسلة رسائل). يربط الخطاف العام النظام بأكمله (كل الخيوط).

لإنشاء ربط عمومي ، تحتاج إلى مشروعين ، أحدهما لإنشاء الملف القابل للتنفيذ و 1 لإنشاء ملف DLL يحتوي على إجراء الخطاف.

تشرح مقالتنا حول التعامل مع خطافات لوحة المفاتيح من Delphi كيفية اعتراض إدخال لوحة المفاتيح لعناصر التحكم التي لا يمكنها تلقي تركيز الإدخال (مثل TImage).

تركيب الماوس

حسب التصميم ، يتم تقييد حركة الماوس حسب حجم شاشة سطح المكتب (بما في ذلك شريط مهام Windows). عند تحريك الماوس إلى الحافة اليسرى / اليمنى / العلوية / السفلية ، "يتوقف" الماوس - كما هو متوقع (إذا لم يكن لديك أكثر من شاشة واحدة).

فيما يلي فكرة عن ربط الماوس على مستوى النظام: إذا كنت تريد ، على سبيل المثال ، تحريك الماوس إلى الجانب الأيمن من الشاشة عندما يتحرك باتجاه الحافة اليسرى (و "لمسها") ، فقد تكتب ربطًا عامًا بالماوس. لإعادة وضع مؤشر الماوس.

عليك البدء بإنشاء مشروع مكتبة ارتباط ديناميكي. يجب على DLL تصدير طريقتين: "HookMouse" و "UnHookMouse".

استدعاء HookMouse الإجراء SetWindowsHookEx API تمرير "WH_MOUSE" للمعلمة الأولى - وبالتالي تثبيت إجراء ربط يراقب رسائل الماوس. واحدة من المعلمات إلى SetWindowsHookEx هي وظيفة رد الاتصال الخاصة بك سوف يتصل بها Windows عندما يكون هناك رسالة ماوس للمعالجة:

SetWindowsHookEx (WH_MOUSE،HookProc، HInstance، 0)؛

تحدد المعلمة الأخيرة (القيمة = 0) في SetWindowsHookEx أننا نقوم بتسجيل ربط عام.

يقوم HookProc بتوزيع الرسائل المتعلقة بالماوس ويرسل رسالة مخصصة ("MouseHookMessage") إلى مشروع الاختبار الخاص بنا:

وظيفة HookProc (nCode: Integer؛ MsgID: WParam؛ Data: LParam): LResult؛ STDCALL.

فار

mousePoint: TPoint؛

notifyTestForm: منطقي؛

MouseDirection: TMouseDirection؛

ابدأ

mousePoint: = PMouseHookStruct (البيانات) ^. pt؛

notifyTestForm: = false؛

   إذا (mousePoint.X = 0) ثم

   ابدأ

Windows.SetCursorPos (-2 + Screen.Width ، mousePoint.y) ؛

notifyTestForm: = صواب ؛

MouseDirection: = mdRight؛

   النهاية;

  

إذا notifyTestForm ثم

   ابدأ

PostMessage (FindWindow ('TMainHookTestForm' ، لا شيء) ، MouseHookMessage ، MsgID ، عدد صحيح (MouseDirection)) ؛

   النهاية;
النتيجة: = CallNextHookEx (Hook، nCode، MsgID، Data)؛

النهاية;

تلميح: اقرأ ملفات تعليمات SDK Win32 لمعرفة المزيد عن سجل PMouseHookStruct وتوقيع دالة HookProc.

ملحوظة: وظيفة ربط لا تحتاج إلى إرسال أي شيء في أي مكان - يتم استخدام استدعاء PostMessage فقط للإشارة إلى أن DLL يمكن التواصل مع العالم "الخارجي".

هوك الفأر "المستمع"

يتم نشر رسالة "MouseHookMessage" إلى مشروع الاختبار الخاص بك - نموذج المسمى "TMainHookTestForm". ستتجاوز طريقة WndProc للحصول على الرسالة والتصرف حسب الحاجة:

إجراء TMainHookTestForm.WndProc (فار الرسالة: TMessage) ؛

ابدأ

   وارث WndProc (رسالة) ؛
  

إذا Message.Msg = HookCommon.MouseHookMessage ثم

   ابدأ

     // تطبيق موجود في الكود المرافق

إشارة (TMouseDirection (Message.LParam)) ؛

   النهاية;

النهاية;

بطبيعة الحال ، عندما يتم إنشاء النموذج (OnCreate) ، يمكنك استدعاء الإجراء HookMouse من مكتبة الارتباط الحيوي (DLL) ، وعندما يتم إغلاقه (OnDestroy) ، يمكنك استدعاء الإجراء UnHookMouse.

ملاحظة: تميل الخطافات إلى إبطاء النظام لأنها تزيد من مقدار المعالجة التي يجب على النظام تنفيذها لكل رسالة. يجب عليك تثبيت الخطاف فقط عند الضرورة ، وإزالته في أقرب وقت ممكن.