نقل الماوس العالمي الأحداث في الكاكاو
-
06-07-2019 - |
سؤال
هل هناك طريقة للتسجيل في فعاليات نقل الماوس العالمي في Cocoa؟لقد تمكنت من التسجيل في الأحداث باستخدام Carbon's InstallEventHandler()
, ، ولكن يفضل ما يعادلها من الكاكاو.لقد بحثت عن NSNotificationCenter
الأحداث، ولكن لا يبدو أن هناك أي أسماء أحداث عامة (هل هناك أسماء خاصة؟)
وبدلا من ذلك، هل هناك طريقة للاستخدام NSTrackingArea
للمشاهدات مع أ clearColor
خلفية؟
التطبيق سنو ليوبارد فقط.
المحلول
في SnowLeopard هناك أسلوب فئة جديدة على NSEvent
التي لا بالضبط ما تريد: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
. فأنت تريد mask = NSMouseMovedMask
.
نصائح أخرى
تم طرح سؤال مماثل بالفعل على StackOverflow:كيفية جعل فئة فرعية شفافة من NSView تتعامل مع أحداث الماوس؟
للتلخيص، لم تنجح طريقة العرض الشفافة.يبدو أن "صنابير حدث الكوارتز" هي أفضل إجابة.
فيما يلي بعض التلميحات حول العمل باستخدام الصنابير:
قم بإنشاء الصنبور باستخدام
CGEventTapCreate
.
أ) بالنسبة لمعلمة الموقع (الأولى) التي قد ترغب في استخدامهاkCGSessionEventTap
.
ب) بالنسبة لمعلمة الموضع (الثانية) التي ربما تريدهاkCGHeadInsertEventTap
.
ج) بالنسبة لمعلمة قناع الحدث، حاول(1 << kCGEventMouseMoved)
.قم بإنشاء مصدر حلقة تشغيل باستخدام
CFMachPortCreateRunLoopSource
, ، بتمرير ضغطة الحدث كمعلمة ثانية.أضف مصدر حلقة التشغيل إلى حلقة التشغيل الخاصة بك.بافتراض أنك تريد إضافتها إلى حلقة التشغيل الرئيسية، قم بما يلي:
CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
تمكين الحدث اضغط مع
CGEventTapEnable
إذا كنت تريد أن تتبع الماوس لا يهم أين هو، وكنت ترغب في CGEventTap. ليس هناك ما يعادلها الكاكاو. إذا كنت ترغب فقط في تتبع ذلك في التطبيق الخاص بك، ثم يجب أن يفسر لماذا كنت تجد نفسك غير قادر على القيام بذلك قليلا أكثر شمولا.