Globale Maus bewegt Events in Cocoa
-
06-07-2019 - |
Frage
Gibt es eine Möglichkeit zur Registrierung für die globalen Mausereignisse in Cocoa bewegten? Ich war in der Lage für die Ereignisse des InstallEventHandler()
mit Hilfe von Kohlenstoff zu registrieren, würde aber eine Cocoa äquivalent bevorzugen. Ich habe für NSNotificationCenter
Ereignisse gesucht, aber es scheint keine öffentliche Veranstaltung Namen zu sein (gibt es Privaten?)
Alternativ ist es eine Möglichkeit, NSTrackingArea
für Ansichten mit einem clearColor
Hintergrund zu benutzen?
Die App ist nur Snow Leopard.
Lösung
In Snowleopard gibt es eine neue Klassenmethode auf NSEvent
, die genau das tun, was Sie wollen: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
. Sie werden mask = NSMouseMovedMask
wollen.
Andere Tipps
Eine ähnliche Frage wurde bereits auf Stackoverflow gestellt: Wie eine transparente NSView Unterklasse Griff machen Mausereignisse?
Um es zusammenzufassen, die tansparent Ansicht Methode funktionierte nicht. Quartz Event-Taps scheinen die beste Antwort zu sein.
Hier sind einige Hinweise auf die Arbeit mit Hähnen:
-
Erstellen Sie den Hahn mit
CGEventTapCreate
.
a) Für den Standort (erste) Parameter, den Sie wahrscheinlichkCGSessionEventTap
verwenden werden soll.
b) Für die Platzierung (Zweit-) Parameter werden Sie wahrscheinlich wollenkCGHeadInsertEventTap
.
c) Für den Fall, Maskenparameter, versuchen(1 << kCGEventMouseMoved)
. -
Erstellen einer Laufschleife Quelle mit
CFMachPortCreateRunLoopSource
, das Ereignis tap als zweiten Parameter. -
Fügen Sie die Laufschleife Quelle zu Ihrer Laufschleife. Unter der Annahme, wollen Sie es auf die Hauptlaufschleife hinzugefügt, tun:
CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
-
das Ereignis Hahn mit
CGEventTapEnable
Aktivieren
Wenn Sie die Maus ganz gleich verfolgen möchten, wo es ist, möchten Sie eine CGEventTap. Es gibt keine Cocoa gleichwertig. Wenn Sie es einfach in Ihre Anwendung verfolgen wollen, dann sollten Sie erklären, warum Sie finden, sich so ein wenig mehr gründlich zu tun, nicht in der Lage.