2012-11-28 37 views
11

मैक ओएस पर सिस्टम-वाइड टच जेस्चर को प्रोग्रामेटिक रूप से अक्षम/दबाने की आवश्यकता है। मैं रिक्त स्थान, आदि के बीच 4-उंगली स्वाइप जैसे संकेतों का जिक्र कर रहा हूं।ओएसएक्स - सिस्टम-वाइड टच जेस्चर अक्षम करना

मैंने EventTap को देखा है लेकिन यह एक विकल्प नहीं दिखता है (यहां पिछली रिपोर्ट के बावजूद - शायद यह 10.8 के तहत बदला गया है)

मैंने प्रोग्राम प्राथमिकताओं को प्रोग्रामिक रूप से बदलने के कई तरीकों की भी कोशिश की है। उदाहरण के लिए, मैंने IORonnectEetCFProperties का उपयोग करके IORegnectEetryCreateCFProperties का उपयोग कर स्थित सेवा पर IOConnectSetCFProperties का उपयोग करने का प्रयास किया है।

मैं भी देखने के लिए कि वे किस तरह यह करना ट्रैकपैड वरीयता फलक में delved है, और मैं यह पुन: पेश करने की कोशिश की (उपेक्षा किसी भी बनाने/रिलीज विसंगतियों, यह सिर्फ परीक्षण कोड):

NSInteger zero = 0; 
    CFNumberRef numberWith0 = CFNumberCreate(kCFAllocatorDefault, kCFNumberNSIntegerType, &zero); 

    CFMutableDictionaryRef propertyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, 
                    &kCFTypeDictionaryKeyCallBacks, 
                    &kCFTypeDictionaryValueCallBacks); 

    CFDictionarySetValue(propertyDict, @"TrackpadFourFingerHorizSwipeGesture", numberWith0); 

    io_connect_t connect = getEVSHandle(); // Found in the MachineSettings framework 

    if (!connect) 
    { 
     NSLog(@"Unable to get EVS handle"); 
    } 

    kern_return_t status = IOConnectSetCFProperties(connect, propertyDict); 

    if (status != KERN_SUCCESS) 
    { 
     NSLog(@"Unable to get set IO properties"); 
    } 

    CFRelease(propertyDict); 
    CFPreferencesSetValue(CFSTR("com.apple.trackpad.fourFingerHorizSwipeGesture"), _numberWith0, kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost); 

    CFPreferencesSetValue(CFSTR("TrackpadFourFingerHorizSwipeGesture"), _numberWith0, CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad"), kCFPreferencesCurrentUser, kCFPreferencesCurrentHost); 

    CFPreferencesSynchronize(kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost); 

    status = BSKernelPreferenceChanged(CFSTR("com.apple.driver.AppleBluetoothMultitouch.trackpad")); 

में यह मामला काम करने लगता है, कोई त्रुटि नहीं है और सिस्टम वरीयता फलक में विकल्प अक्षम हो जाता है, हालांकि चार अंगुली इशारा काम जारी है। मुझे संदेह है कि उसमें लॉग आउट करने का असर होगा, लेकिन मैंने कोशिश नहीं की है क्योंकि यह किसी भी मामले में पर्याप्त नहीं है।

यह ध्यान देने योग्य है कि प्रीफ फलक स्वयं भी बीएस कर्नेल प्रीफरेंस को बुलाता है, लेकिन मुझे नहीं पता कि इससे लिंक करने के लिए कौन सा ढांचा हो सकता है। शायद यह समस्या की कुंजी है ...

अद्यतन: असल में मैंने इसे अब पाया है और इसे लिंक किया है। उस कॉल को जोड़ने से कोई फर्क नहीं पड़ता, हालांकि यह 1 लौटाता है जो एक त्रुटि इंगित कर सकता है। मैंने उपरोक्त कोड में कॉल जोड़ा है।

अंत में मैं टर्मिनल से यह कोशिश की:

defaults write -globalDomain com.apple.trackpad.fourFingerHorizSwipeGesture 0 
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadFourFingerHorizSwipeGesture 0 

कि एक तत्काल प्रभाव या तो नहीं है।

मैं नहीं मानता कि यह संभव नहीं है, वहाँ एक रास्ता होना चाहिए ...

मास संगतता की आवश्यकता नहीं है।

+0

में प्रवेश को देखने के लिए कॉल क्वार्ट्ज घटना सेवाओं के लिए क्या बना रहे हैं "चूक लिखने" संभव है बिट, क्या आप "से एक तत्काल नहीं है मतलब है प्रभाव "क्या यह रीबूट के बाद काम करता है? कई डिफ़ॉल्टों को प्रभावी होने के लिए आपको कई बार 'मार डालो' और 'किलर फाइंडर' करना होता है। – jeremy

+0

हाय जेरेमी। दरअसल, लेकिन मुझे तत्काल प्रभाव होने की आवश्यकता है, जैसे कि जब आप वरीयता फलक में ट्रैकपैड विकल्प बदलते हैं। – tarmes

+0

अगर आप लॉग आउट नहीं करना चाहते हैं तो आप खोजक को फिर से लॉन्च करने का प्रयास कर सकते हैं। –

उत्तर

0

मुझे लगता है कि आप स्पर्श घटनाओं को अक्षम करने के लिए गलत स्थान पर देख रहे हैं। ओएसएक्स (और कई अन्य सिस्टम) जिस तरह से ईवेंट को संभालने के लिए दृश्य श्रृंखला में पहला उत्तरदाता घटना को प्रचार से रोक देगा। आपको उन सभी स्पर्श ईवेंटों के लिए ईवेंट हैंडलर लिखना होगा जिन्हें आप संभालना चाहते हैं, और यदि वे मौजूद हैं, तो ओएस खोजकर्ता को सभी तरह से ईवेंट भेजना बंद कर देगा या स्पर्श को संभालने के लिए जो भी अन्य एप्लिकेशन अगली पंक्ति में है आयोजन।

देखें: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/HandlingTouchEvents/HandlingTouchEvents.html

विशेष रूप से: हैंडलिंग मल्टी टच घटनाक्रम (setAcceptsTouchEvents फोन छूता लागू तो, ... withEvent ...)

आशा है कि मदद करता है!

+0

हाय। मुझे कोई जानकारी नहीं है कि क्या वैश्विक संकेतों के बावजूद यह एक मानक ऐप के लिए काम करेगा। किसी भी मामले में मैं ऐसा नहीं कर सकता क्योंकि मैं किसी अन्य ऐप में जेस्चर जोड़ने की कोशिश कर रहा हूं (इसे सहायक एपीआई के माध्यम से नियंत्रित करना)। तो, मुझे वह करना है जो मैं करने की कोशिश कर रहा हूं ... – tarmes

+0

हॉटकी पर, क्या आप स्क्रीन पर एक पारदर्शी पूर्ण स्क्रीन दृश्य लोड कर सकते हैं जो घटनाओं को कैप्चर कर सकता है? – jeremy

+0

दुर्भाग्य से नहीं, क्योंकि उपयोगकर्ता को अभी भी अन्य ऐप से बातचीत करने में सक्षम होना चाहिए। – tarmes

1

मैं भी ऐसा करने की कोशिश कर रहा हूं।

इवेंट टैप काम नहीं करते हैं, न ही कोई ऐसा विचार है जो पहले उत्तरदाता है।

एप्पल डॉक्स से:

हालांकि, वहाँ इस तरह के एक चार-अंगुली स्वाइप के रूप में कुछ सिस्टम-वाइड इशारों, कर रहे हैं।जिसके लिए किसी एप्लिकेशन को निष्पादित करने वाले किसी इशारे पर सिस्टम कार्यान्वयन प्राथमिकता लेता है।

एक ही रास्ता मैं प्रणाली विस्तृत इशारों CGDisplayCapture उपयोग कर रहा है को रोकने के लिए कर लिया है। यह मेरे एप्लिकेशन को सभी घटनाओं के लिए विशेष पहुंच प्रदान करता है ... लेकिन एक पूर्णस्क्रीन ड्राइंग संदर्भ भी देता है।

शायद यह जब के लिए इस विधा

https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html