Trackpad-Gestures ausserhalb einer Applikation erkennen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Trackpad-Gestures ausserhalb einer Applikation erkennen

    Ich möchte eine kleine Applikation erstellen, die auf eine bestimmte Gesture reagiert (z.B. drei Finger Swipe nach rechts). Jedoch soll diese nicht nur im Fenster meiner Applikation erkannt werden, sondern auch auf dem Desktop oder während ein anderes Programm läuft. Gibt es da so etwas wie Notifications? Falls nein, wie geht das?
  • Das geht mit EventTaps (Quartz Event Services). Dummerweise gibt es keine gescheiten Event Masks für Gesten, deshalb muss man alle Events anzapfen und dann filtern. Hier ein Beispiel:

    Quellcode

    1. //Der Callback, der die Events bekommt
    2. CGEventRef myEventTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef cgEvent, void* refcon) {
    3. //Schnell raus, wenn es eindeutig keine Geste ist (hier kann viel rein kommen)
    4. if (type <= kCGEventTabletProximity) return cgEvent;
    5. NSEvent* nsEvent = [NSEvent eventWithCGEvent:cgEvent];
    6. switch ([nsEvent type]) {
    7. case NSEventTypeMagnify:
    8. NSLog(@"magnify %f",[nsEvent magnification]);
    9. break;
    10. case NSEventTypeSwipe:
    11. NSLog(@"swipe %f %f",[nsEvent deltaX],[nsEvent deltaY]);
    12. break;
    13. case NSEventTypeRotate:
    14. NSLog(@"rotate %f",[nsEvent rotation]);
    15. break;
    16. }
    17. return cgEvent;
    18. }
    19. // Irgendwo im Hauptcode den Event Tap aktivieren
    20. CFMachPortRef tap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myEventTapCallback, NULL);
    21. CFRunLoopAddSource(CFRunLoopGetMain(), CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0), kCFRunLoopCommonModes);
    Alles anzeigen
    Multigrad - 360°-Produktfotografie für den Mac