2011-05-25 7 views
13

मैं एनएसएसईआरओएल के प्रकार के एनएसईएंडेंट (नकली) बनाना चाहता हूं। कुछ अन्य प्रकार के एनएसईवींट्स (माउसइवेंट, कीइवेंट, एंटरएक्सिटइवेंट, अन्य इवेंट) के लिए एनएसईएंड कन्स्ट्रक्टर विधियां हैं, लेकिन कोई भी मुझे सेट करने की अनुमति नहीं देता है, उदाहरण के लिए, डेल्टाएक्स।NSScrollWheel प्रकार का NSEvent कैसे बनाएं?

उत्तर

11

एनएसईएन्टेंट ऐसा करने का कोई तरीका नहीं प्रदान करता है, लेकिन आप एक सीजीईवीएन बना सकते हैं और इसके आसपास एक एनएसईएंड रैपर बना सकते हैं। ईवेंट स्वचालित रूप से कर्सर के वर्तमान स्थान का उपयोग करेगा। CGEventCreateScrollWheelEvent देखें। हालांकि, एनएसपीप्लिकेशंस के postEvent:atStart: का उपयोग करके इस घटना को पोस्ट करना काम नहीं करता है (संभवतः क्योंकि इसमें खिड़की परिभाषित नहीं है)। आप या तो CGEvent सीधे ईवेंट स्ट्रीम पर पोस्ट कर सकते हैं, या NSEvent को सीधे दृश्य के scrollWheel: विधि पर भेज सकते हैं।

CGWheelCount wheelCount = 2; // 1 for Y-only, 2 for Y-X, 3 for Y-X-Z 
int32_t xScroll = −1; // Negative for right 
int32_t yScroll = −2; // Negative for down 
CGEventRef cgEvent = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitLine, wheelCount, yScroll, xScroll); 

// You can post the CGEvent to the event stream to have it automatically sent to the window under the cursor 
CGEventPost(kCGHIDEventTap, cgEvent); 

NSEvent *theEvent = [NSEvent eventWithCGEvent:cgEvent]; 
CFRelease(cgEvent); 

// Or you can send the NSEvent directly to a view 
[theView scrollWheel:theEvent]; 
+0

+1 काफी बेहतर खान से जवाब! –

2

आप CGEventCreateScrollWheelEvent का उपयोग करके eventWithCGEvent: के साथ NSEvent में परिवर्तित कर सकते हैं। CGEvent पर जानकारी जोड़ने के लिए, CGEventSetIntegerValueField का उपयोग करें - संभावित fieldskCGScrollWheelEventDeltaAxis1, ...2, और ...3 के बीच हैं।

1

कोड निम्न प्रयास करें:

int scrollingDeltaX =... //custom value 

//if you have some NSEvent *theEvent 
    CGEventRef cgEvent = CGEventCreateCopy(theEvent.CGEvent); 

    CGEventSetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2, scrollingDeltaX); 

    NSEvent *newEvent = [NSEvent eventWithCGEvent:cgEvent]; 
    CFRelease(cgEvent); 
संबंधित मुद्दे