تعرف على كيفية تتبع نشاط الماوس حتى عندما لا يكون تطبيق دلفي الخاص بك نشطًا صينية أو يفعل ليس لديها أي واجهة مستخدم على الاطلاق.
من خلال تثبيت خطاف الماوس على مستوى النظام (أو العالمي) يمكنك مراقبة ما يفعله المستخدم باستخدام الفأر وتتصرف وفقًا لذلك.
ما هو الخطاف وكيف يعمل؟
باختصار ، الخطاف هو (أتصل مرة أخرى) يمكنك إنشاؤها كجزء من DLL (مكتبة الارتباط الحيوي) أو تطبيقك لمراقبة "الأحداث الجارية" داخل نظام تشغيل Windows.
هناك نوعان من الخطافات - العالمية والمحلية. يراقب خطاف محلي الأشياء التي تحدث فقط لبرنامج معين (أو موضوع). خطاف عام يراقب النظام بأكمله (جميع الخيوط).
لإنشاء خطاف عام ، تحتاج إلى مشروعين ، أحدهما لإنشاء الملف القابل للتنفيذ والآخر لإنشاء ملف DLL يحتوي على إجراء الخطاف.
مقالتنا عن العمل مع خطافات لوحة المفاتيح من دلفي يشرح كيفية اعتراض إدخال لوحة المفاتيح لعناصر التحكم التي لا يمكنها استقبال تركيز الإدخال (مثل TImage).
ربط الماوس
حسب التصميم ، يتم تقييد حركة الماوس حسب حجم شاشة سطح المكتب (بما في ذلك شريط مهام Windows). عند تحريك الماوس إلى الحافة اليسرى / اليمنى / العلوية / السفلية ، "سيتوقف" الماوس - كما هو متوقع (إذا لم يكن لديك أكثر من جهاز عرض واحد).
إليك فكرة عن خطاف الماوس على مستوى النظام: إذا كنت تريد على سبيل المثال تحريك الماوس إلى الجانب الأيمن من الشاشة عندما يتحرك باتجاه الحافة اليسرى (و "يلمسه") ، يمكنك كتابة خطاف ماوس عام لتغيير موضع الماوس المؤشر.
تبدأ بإنشاء مشروع مكتبة ارتباط ديناميكي. يجب أن يصدر DLL طريقتين: "HookMouse" و "UnHookMouse".
إجراء HookMouse يستدعي SetWindowsHookEx API تمرير "WH_MOUSE" للمعلمة الأولى - وبالتالي تثبيت إجراء ربط يراقب رسائل الماوس. إحدى المعلمات لـ SetWindowsHookEx هي وظيفة رد الاتصال الخاصة بك التي سيستدعيها Windows عند وجود رسالة ماوس ليتم معالجتها:
SetWindowsHookEx (WH_MOUSE،HookProc، HInstance، 0) ؛
تحدد المعلمة الأخيرة (القيمة = 0) في SetWindowsHookEx أننا نسجل ربطًا عامًا.
يقوم HookProc بتحليل الرسائل المتعلقة بالماوس ويرسل رسالة مخصصة ("MouseHookMessage") إلى مشروع الاختبار الخاص بنا:
وظيفة HookProc (nCode: عدد صحيح؛ MsgID: WParam؛ البيانات: LParam): LResult ؛ stdcall.
فار
ماوس بوينت: TPoint ؛
notifyTestForm: منطقي؛
MouseDirection: TMouseDirection ؛
ابدأ
mousePoint: = PMouseHookStruct (البيانات) ^. pt؛
notifyTestForm: = false ؛
إذا (ماوس بوينت. س = 0) ثم
ابدأ
شبابيك. SetCursorPos (-2 + شاشة. العرض ، mousePoint.y) ؛
notifyTestForm: = صحيح ؛
اتجاه الماوس: = mdRight ؛
النهاية;
...
إذا إعلام الإختبار ثم
ابدأ
PostMessage (FindWindow ('TMainHookTestForm' ، لا شيء) ، MouseHookMessage ، MsgID ، عدد صحيح (MouseDirection)) ؛
النهاية;
النتيجة: = CallNextHookEx (Hook، nCode، MsgID، Data)؛
النهاية;
تلميح: اقرأ ملفات تعليمات Win32 SDK للتعرف على سجل PMouseHookStruct وتوقيع وظيفة HookProc.
ملحوظة: لا تحتاج دالة ربط لإرسال أي شيء في أي مكان - يتم استخدام استدعاء PostMessage فقط للإشارة إلى أنه يمكن لـ DLL الاتصال بالعالم "الخارجي".
ربط الماوس "مستمع"
يتم نشر رسالة "MouseHookMessage" في مشروع الاختبار الخاص بك - نموذج يسمى "TMainHookTestForm". ستتجاوز طريقة WndProc للحصول على الرسالة والتصرف حسب الحاجة:
إجراء TMainHookTestForm. WndProc (فار الرسالة: TMessage) ؛
ابدأ
وارث WndProc (رسالة) ؛
إذا رسالة. Msg = HookCommon. MouseHookMessage ثم
ابدأ
// التنفيذ الموجود في الكود المصاحب
إشارة (TMouseDirection (رسالة. LParam)) ؛
النهاية;
النهاية;
بالطبع ، عندما يتم إنشاء النموذج (OnCreate) ، يمكنك استدعاء إجراء HookMouse من مكتبة الارتباط الحيوي (DLL) ، عندما يتم إغلاقه (OnDestroy) ، يمكنك استدعاء إجراء UnHookMouse.
ملاحظة: تميل الخطافات إلى إبطاء النظام لأنها تزيد من كمية المعالجة التي يجب أن يقوم بها النظام لكل رسالة. يجب عليك تثبيت خطاف فقط عند الضرورة ، وإزالته في أقرب وقت ممكن.