2009-04-10 8 views
6

पर ले जा रहा है मैं MATLAB के PsychToolbox में एक एक्सटेंशन विकसित कर रहा हूं जो मनोविज्ञान प्रयोगों के दौरान माउस के बेहतर नियंत्रण की अनुमति देता है (विशेष रूप से, स्क्रीन सीमाओं को ड्रैग ऑपरेशंस को सीमित करने से रोकता है ... इसे महसूस करना चाहिए जैसे आप माउस को सभी दिशाओं में "असीमित" स्थानांतरित कर सकते हैं)। चूंकि MATLAB अतिरिक्त धागे के निर्माण का समर्थन नहीं करता है (और है कि बेकार में वैसे भी इस स्थिति के लिए जटिल हो जाएगा), मैं या तो कार्बन या कोको इवेंट मैनेजर का उपयोग नहीं कर सकते हैं।मैक ओएस एक्स: CGGetLastMouseDelta और माउस को प्रोग्रामिंग

CGGetLastMouseDelta मैं क्या करने की जरूरत है के लिए लगभग पूर्ण है (यह मेरे राशि माउस ले जाया गया है हो जाता है "पिछले माउस आंदोलन आवेदन द्वारा प्राप्त घटना के बाद से" स्क्रीन सीमाओं की अनदेखी), लेकिन वहाँ एक मामूली समस्या है। जब प्रोग्राम के माउस को ले जाकर (या तो CGWarpMouseCursorPosition या CGDisplayMoveCursorToPoint का प्रयोग करके), कोई घटनाओं उत्पन्न कर रहे हैं। इसलिए, CGGetLastMouseDelta को पता नहीं चलता है कि माउस बिल्कुल चले गए हैं। दूसरे शब्दों में, अगर मैं माउस 50 पिक्सल और 50 पिक्सल नीचे प्रोग्राम के ले जाते हैं, CGGetLastMouseDelta रिटर्न (0, 0) माउस डेल्टा के लिए बाद में। यह मेरे संदर्भ में अवांछित व्यवहार है, और बदसूरत कामकाज की आवश्यकता है। मैं घटना प्रणाली के माध्यम से घटनाओं पोस्टिंग द्वारा माउस को ले की कोशिश की है, इस प्रकार है (यह एक "mexFunction" है, सी कोड बुलाने की MATLAB के रास्ते):

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 
    CGEventRef event; 
    CGPoint offset; 
    CGPoint currentLocation; 
    CGPoint newLocation; 

    if (nrhs != 2) 
     mexErrMsgTxt("The global x and y coordinates (and only those) must be supplied."); 

    event = CGEventCreate(NULL); 
    currentLocation = CGEventGetLocation(event); 
    CFRelease(event); 

    offset = CGPointMake((CGFloat) mxGetScalar(prhs[0]), (CGFloat) mxGetScalar(prhs[1])); 
    newLocation = CGPointMake(currentLocation.x + offset.x, currentLocation.y + offset.y); 

    event = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newLocation, kCGMouseButtonLeft); 
    CGEventPost(kCGHIDEventTap, event); 
    CFRelease(event); 
} 

इस खुशी से माउस ले जाता है, लेकिन ऐसा नहीं करता लगता है कि CGGetLastMouseDelta के व्यवहार को बिल्कुल बदलना प्रतीत होता है। क्या कोई CGGetLastMouseDelta (और कब?) द्वारा लौटाए गए संबंधों के बारे में सटीक विनिर्देशों को जानता है। इस सामग्री (क्वार्ट्ज संदर्भ) पर पर एप्पल के प्रलेखन बेकार करने के लिए हमेशा की तरह करीब (कम से कम या, आवश्यक विवरण में कमी) के रूप में है।

धन्यवाद!

उत्तर

2

एक अच्छा विचार CGAssociateMouseAndMouseCursorPosition(0) उपयोग करने के लिए कर्सर से माउस आंदोलन डिस्कनेक्ट करने के लिए हो सकता है। फिर आपको स्क्रीन सीमाओं के साथ समस्या नहीं मिलती है।

0

विकल्प (1) अपनी खुद की घटना है जो यह बताता है कि आप माउस को स्थानांतरित करने के कारण होता है उत्पन्न करें।
विकल्प (2) मैं माउस दिनचर्या ले जाया से अपने माउस ले जाया ईवेंट हैंडलर समारोह कॉल करें।