Global Mouse ha spostato gli eventi nel cacao
-
06-07-2019 - |
Domanda
Esiste un modo per registrarsi per eventi globali spostati con il mouse in Cocoa? Sono stato in grado di registrarmi per gli eventi utilizzando Carbon InstallEventHandler()
, ma preferirei un equivalente di cacao. Ho cercato NSNotificationCenter
eventi, ma sembra che non ci siano nomi di eventi pubblici (ce ne sono di privati?)
In alternativa, c'è un modo per usare NSTrackingArea
per le viste con clearColor
sfondo?
L'app è solo Snow Leopard.
Soluzione
In SnowLeopard c'è un nuovo metodo di classe su NSEvent
che fa esattamente quello che vuoi: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
. & # 8217; vuoi mask = NSMouseMovedMask
.
Altri suggerimenti
Una domanda simile era già stata posta su StackOverflow: Come creare un handle di sottoclasse NSView trasparente eventi del mouse?
Per riassumere, il metodo di visualizzazione trasparente non ha funzionato. Quartz Event Taps sembra essere la risposta migliore.
Ecco alcuni suggerimenti su come lavorare con i tocchi:
-
Crea il rubinetto con
CGEventTapCreate
.
a) Per il parametro location (primo) probabilmente vorrai usarekCGSessionEventTap
.
b) Per il parametro di posizionamento (secondo) probabilmente vorraikCGHeadInsertEventTap
.
c) Per il parametro maschera evento, prova(1 << kCGEventMouseMoved)
. -
Crea una sorgente di ciclo di esecuzione con
CFMachPortCreateRunLoopSource
, passando il rubinetto dell'evento come secondo parametro. -
Aggiungi l'origine del ciclo di esecuzione al ciclo di esecuzione. Supponendo di volerlo aggiungere al ciclo di esecuzione principale, eseguire:
CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
-
Abilita il tocco dell'evento con
CGEventTapEnable
Se vuoi tenere traccia del mouse, non importa dove si trovi, vuoi un CGEventTap. Non esiste un equivalente di cacao. Se vuoi solo rintracciarlo nella tua applicazione, dovresti spiegare perché non riesci a farlo in modo un po 'più approfondito.