2009-10-27 9 views
10

कोको में वैश्विक माउस चालित घटनाओं के लिए पंजीकरण करने का कोई तरीका है? मैं कार्बन के InstallEventHandler() का उपयोग कर घटनाओं के लिए पंजीकरण करने में सक्षम था, लेकिन कोको समकक्ष पसंद करूंगा। मैं NSNotificationCenter घटनाओं के लिए ध्यान दिया है, लेकिन वहाँ भी सार्वजनिक ईवेंट के नाम होना प्रतीत नहीं होता है (वहाँ निजी होते हैं?)वैश्विक माउस कोको में

वैकल्पिक रूप से, वहाँ एक clearColor पृष्ठभूमि के साथ विचारों के लिए NSTrackingArea उपयोग करने के लिए एक तरीका है?

ऐप केवल हिम तेंदुए है।

उत्तर

23

स्नोलोपर्ड में NSEvent पर एक नई कक्षा विधि है जो आप चाहते हैं: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block। आप mask = NSMouseMovedMask चाहते हैं।

+1

बिल्कुल सही, ठीक वही जो मैं खोज रहा था। ब्लॉक का उपयोग करने के लिए बोनस। कोड की 3 लाइनें जहां अन्य ने 20ish लिया। –

3

यदि आप माउस को ट्रैक करना चाहते हैं चाहे कोई फर्क नहीं पड़ता, तो आप एक CGEventTap चाहते हैं। कोई कोको समकक्ष नहीं है। यदि आप इसे अपने एप्लिकेशन में ट्रैक करना चाहते हैं तो आपको यह समझाया जाना चाहिए कि आप खुद को इतनी अच्छी तरह से करने में असमर्थ क्यों हैं।

+0

घटना नल के साथ घटना नल सक्षम निश्चित रूप से जाने का रास्ता है। मेरे लिए पूरी तरह से काम करता है। – Leibowitzn

+0

यह मेरे लिए पूरी तरह से काम करता था, लेकिन बेन का जवाब निश्चित रूप से वही था जो मैं खोज रहा था। –

11

ऐसा ही एक सवाल पहले से ही StackOverflow पर कहा गया था: How to make a transparent NSView subclass handle mouse events?

संक्षेप में, tansparent दृश्य विधि काम नहीं किया। क्वार्ट्ज इवेंट टैप्स सबसे अच्छा जवाब प्रतीत होता है।

यहाँ नल के साथ काम करने के बारे में कुछ संकेत दिए हैं:

  1. CGEventTapCreate साथ नल बनाएँ।
    ए) स्थान (पहले) पैरामीटर के लिए आप शायद kCGSessionEventTap का उपयोग करना चाहेंगे।
    बी) प्लेसमेंट (दूसरे) पैरामीटर के लिए आप शायद kCGHeadInsertEventTap चाहते हैं।
    सी) घटना मास्क पैरामीटर के लिए, (1 << kCGEventMouseMoved) आज़माएं।

  2. CFMachPortCreateRunLoopSource के साथ रन लूप स्रोत बनाएं, ईवेंट पैरा को दूसरे पैरामीटर के रूप में पास करें।

  3. रन लूप स्रोत को अपने रन लूप में जोड़ें। मान लें कि आप चाहते हैं कि उसे मुख्य रन पाश को जोड़ा गया, कार्य करें: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

  4. CGEventTapEnable

+0

सहायता के लिए धन्यवाद। मैं घटना को थोड़ा बेहतर समझता हूं। हालांकि, मैं बेन की एनएसईवेंट विधि का उपयोग कर समाप्त हुआ। –