اعتراض النقر فوق حدث لجميع عناصر التحكم في التطبيق في C# (WinForms)

StackOverflow https://stackoverflow.com/questions/4279732

سؤال

أرغب في تقديم تطبيق لاعتراض جميع أحداث واجهة المستخدم في جميع أشكال طلبي وكتابتها إلى سجل. يمكن أن تستخدم هذه البيانات لمعرفة أدوات التحكم الأكثر استخدامًا ، وبعيدًا ، وما إلى ذلك. المشكلة هي أنني أريد أن يحدث هذا تلقائيًا ، دون تعديل الفئات الموجودة.

لقد صنعت نموذجًا أوليًا يرفق طريقة لحدث نقرة لجميع عناصر التحكم في نموذج ، ولكن كيف يمكن القيام بذلك لجميع النماذج؟ يحتاج الانعكاس إلى كائن مستهدف عند معالجة الأحداث ، ولكن يمكن الوصول بسهولة إلى نموذج بدء التشغيل.

هل هناك طريقة لتوصيل مُنشئ كائن ما؟ ثم يمكنني "ضخ" طريقتي في جميع أحداث النموذج الجديد. أو ربما هناك طريقة أخرى للقيام بذلك.

شكرا مقدما!

هل كانت مفيدة؟

المحلول

يمكنك تثبيت ملف مرشح الرسائل.

مرشح الرسائل هو كائن ينفذ IMessageFilter. WinForms يدعو الخاص بك PreFilterMessage طريقة لكل رسالة تمر عبر حلقة رسالة موضوعك. هذا يكفي لمراقبة إدخال المستخدم عبر التطبيق (ويمنحك خيار معالجة ذلك).

نصائح أخرى

في Windows API ، يتم ذلك باستخدام الخطافات المحلية (يمكنك ضبط خطاف الماوس المحلي باستخدام Setwindowshookex وظيفة). هذه هي الطريقة الصحيحة للقيام بمهمتك. في C# ، تحتاج إلى استخدام P/Invoke من أجل الوصول إلى SetWindowshookex.

تتمثل مهمة أخرى في مطابقة HWND (HOWSENT HANDER) مع التحكم في WINFORMS. اقرأ هذه المقالة لكيفية القيام بذلك (عبر رسالة WM_GetControlName).

انظر أيضا هذا السؤال وهو مكرر لك.

سيكون عليك العمل مع رسائل واجهة برمجة تطبيقات Win32 ، كما أعتقد.

إليك مثال صغير تحت شكل البرنامج التعليمي.

يجب أن تكون قادرًا على تحقيق ما تريد به مرشحات الرسائل - لا يوجد P/استدعاء إلى Win32-Apis المطلوبة!

انظر المساعدة على IMessageFilter واجهة لمزيد من المعلومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top