2009-10-27 4 views
10

Gibt es eine Möglichkeit, sich für globale bewegte Mausereignisse in Cocoa zu registrieren? Ich konnte mich für die Events mit Carbon's InstallEventHandler() registrieren, würde aber ein Cocoa-Äquivalent bevorzugen. Ich habe für NSNotificationCenter Ereignisse gesucht, aber es scheint keine öffentliche Veranstaltung Namen zu sein (gibt es Privaten?)Global Mouse bewegte Ereignisse in Cocoa

Alternativ ist es eine Möglichkeit, NSTrackingArea für Ansichten mit einem clearColor Hintergrund zu benutzen?

Die App ist nur Snow Leopard.

Antwort

23

In SnowLeopard gibt es eine neue Klassenmethode auf NSEvent, die genau das tut, was Sie wollen: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block. Du wirst wollen mask = NSMouseMovedMask.

+1

Perfekt, genau das, was ich gesucht habe. Bonus für die Verwendung von Blöcken. 3 Zeilen Code, wo die anderen 20ish nahmen. –

3

Wenn Sie die Maus verfolgen möchten, egal wo sie ist, möchten Sie eine CGEventTap. Es gibt kein Cocoa-Äquivalent. Wenn Sie es nur in Ihrer Anwendung verfolgen möchten, sollten Sie erklären, warum Sie dies nicht mehr ein wenig genauer tun können.

+0

Event-Taps sind definitiv der Weg zu gehen. Funktioniert perfekt für mich. – Leibowitzn

+0

Das hat perfekt für mich funktioniert, aber Bens Antwort war definitiv genau das, wonach ich gesucht habe. –

11

Eine ähnliche Frage wurde bereits auf Stackoverflow gestellt: How to make a transparent NSView subclass handle mouse events?

Zusammengefasst arbeiten die tansparent Ansicht Methode nicht. Quartz Event Taps scheinen die beste Antwort zu sein.

Hier sind einige Hinweise auf mit Armaturen arbeiten:

  1. mit CGEventTapCreate den Hahn erstellen.
    a) Für den Parameter location (first) möchten Sie wahrscheinlich kCGSessionEventTap verwenden.
    b) Für den Platzierungs (zweiten) Parameter werden Sie wahrscheinlich kCGHeadInsertEventTap wollen.
    c) Versuchen Sie für den Ereignismaskenparameter (1 << kCGEventMouseMoved).

  2. Erstellen Sie eine Run-Loop-Quelle mit CFMachPortCreateRunLoopSource und übergeben Sie den Ereignis-Tap als zweiten Parameter.

  3. Fügen Sie die Run-Loop-Quelle zu Ihrer Laufschleife hinzu. Angenommen, Sie wollen, dass es die Hauptlaufschleife hinzugefügt, tun: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

  4. Aktivieren Sie den Ereignishahn mit CGEventTapEnable

+0

Danke für die Hilfe. Ich verstehe, dass die Ereignisse jetzt ein bisschen besser sind. Ich benutzte Bens NSEvent-Methode. –