2012-11-28 11 views
11

Potrzebuję programowo wyłączać/blokować gesty dotykowe dla całego systemu w systemie Mac OS. Mam na myśli takie gesty, jak przesunięcie palcem między spacji na 4 palce, itp.OSX - wyłączanie gestów dotykowych w całym systemie

Sprawdziłem EventTap, ale nie wydaje mi się to możliwe (mimo wcześniejszych raportów tutaj - być może zmieniono to pod 10,8)

Próbowałem również wiele sposobów na zmianę preferencji systemowych programowo. Na przykład próbowałem użyć IOConnectSetCFProperties w usłudze, która zlokalizowała go przy użyciu IORegistryEntryCreateCFProperties.

Ja również zagłębił się w panelu preferencji trackpad, aby zobaczyć jak oni to robią, a ja starałem się go odtworzyć (ignoruje wszelkie tworzenie/niespójności zwalniające, to jest kod tylko test):

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")); 

W w tym przypadku wygląda na to, że działa, nie ma błędów, a opcja zostaje wyłączona w panelu preferencji systemu, jednak gest czterech palców nadal działa. Podejrzewam, że wylogowanie się będzie miało skutek, ale nie próbowałem, ponieważ nie jest to wystarczająco dobre.

Warto zauważyć, że samo okienko Pref również wywołuje BSKernelPreferenceChanged, ale nie wiem, które ramy mogą być w celu dołączenia do niego. Być może jest to kluczem do problemu ...

AKTUALIZACJA: Właściwie znalazłem go i powiązałem z tym. Dodanie tego wywołania nie miało znaczenia, chociaż zwraca 1, co może wskazywać na błąd. Dodałem połączenie do powyższego kodu.

końcu próbowałem to z terminala:

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

który nie ma natychmiastowy efekt albo.

Nie wierzę, że nie jest to możliwe, musi być jakiś sposób ...

kompatybilność MAS nie jest wymagane.

+0

Dla „defaults write” bit, co masz na myśli przez „nie ma natychmiastowego efekt "Czy działa po ponownym uruchomieniu? Wiele razy trzeba "killall dock" i "killall finder", aby niektóre z ustawień domyślnych zaczęły obowiązywać. – jeremy

+0

Cześć Jeremy. Rzeczywiście, ale potrzebuję tego, aby uzyskać natychmiastowy efekt, tak jak w przypadku zmiany opcji gładzika w panelu preferencji. – tarmes

+0

możesz spróbować ponownie uruchomić wyszukiwarkę, jeśli nie chcesz się wylogować. –

Odpowiedz

0

Myślę, że szukasz niewłaściwego miejsca do wyłączenia zdarzeń dotyku. Sposób, w jaki OSX (i wiele innych systemów) polega na tym, że pierwszy responder w łańcuchu widoku obsługujący zdarzenie zatrzyma propagowanie zdarzenia. Będziesz musiał napisać programy obsługi zdarzeń w swoich widokach dla każdego zdarzenia dotykowego, które chcesz obsłużyć, a jeśli one istnieją, system operacyjny przestanie wysyłać zdarzenia do samego Findera lub innej aplikacji, która będzie następnym razem obsługiwać dotyk wydarzenia.

Patrz: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/HandlingTouchEvents/HandlingTouchEvents.html

Konkretnie: Posługiwanie Multi-Touch Events (setAcceptsTouchEvents zadzwonić, a następnie wdrożyć poprawki ... WithEvent ...)

nadzieję, że pomoże!

+0

Witam. Nie mam pojęcia, czy to by działało dla standardowej aplikacji, gdyby globalne gesty nadal miały miejsce. W każdym razie nie mogę tego zrobić, ponieważ próbuję dodać gesty do innej aplikacji (kontrolując ją za pomocą interfejsu API Assistive). Tak więc, muszę zrobić to, co próbuję zrobić ... – tarmes

+0

W skrócie, czy można załadować przezroczysty widok pełnoekranowy na ekran, który może przechwytywać zdarzenia? – jeremy

+0

Niestety nie, ponieważ użytkownik nadal musi mieć możliwość interakcji z inną aplikacją. – tarmes

1

Próbuję również to zrobić.

Przyciski zdarzeń nie działają, podobnie jak widok pierwszego reagowania.

Od docs Apple:

Jednak istnieją pewne gesty całego systemu, takie jak machnięcia czterema palcami.dla których implementacja systemu ma pierwszeństwo przed każdym operowaniem gestem, który wykonuje aplikacja.

Jedynym sposobem, w jaki mogłem zatrzymać gesty w całym systemie, jest użycie CGDisplayCapture. Daje to mojej aplikacji wyłączny dostęp do wszystkich zdarzeń ... ale także kontekst rysowania pełnoekranowego.

Być może jest to możliwe, aby zobaczyć, jakie połączenia są wykonane z usługami zdarzeń kwarcowych po wejściu do tego trybu

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

Powiązane problemy