2009-10-27 8 views
10

C'è un modo per registrarsi per eventi spostati mouse globale in Cocoa? Sono stato in grado di registrarmi per gli eventi utilizzando Carbon's InstallEventHandler(), ma preferirei un equivalente Cocoa. Ho cercato NSNotificationCenter eventi, ma non sembra esserci nomi di eventi pubblici (ci sono quelli privati?)Mouse globale spostato eventi in Cocoa

In alternativa, c'è un modo per utilizzare NSTrackingArea per opinioni con uno sfondo clearColor?

L'app è solo Snow Leopard.

risposta

23

In SnowLeopard è disponibile un nuovo metodo di classe su NSEvent che fa esattamente ciò che si desidera: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block. Ti consigliamo di mask = NSMouseMovedMask.

+1

Perfetto, esattamente quello che stavo cercando. Bonus per l'utilizzo di blocchi. 3 righe di codice in cui gli altri hanno preso 20ish. –

3

Se si desidera tenere traccia del mouse, non importa dove si trova, si desidera un CGEventTap. Non esiste un equivalente di cacao. Se vuoi semplicemente rintracciarlo nella tua applicazione, dovresti spiegare perché ti stai rendendo incapace di farlo un po 'più a fondo.

+0

rubinetti eventi sono sicuramente la strada da percorrere. Funziona perfettamente per me. – Leibowitzn

+0

Questo ha funzionato perfettamente per me, ma la risposta di Ben è stata sicuramente esattamente quello che stavo cercando. –

11

Una domanda simile è stato già chiesto in StackOverflow: How to make a transparent NSView subclass handle mouse events?

In sintesi, il metodo di visualizzazione tansparent non ha funzionato. I rubinetti Quartz Event sembrano essere la migliore risposta.

Ecco alcuni suggerimenti su come lavorare con i rubinetti:

  1. Creare il rubinetto con CGEventTapCreate.
    a) Per il parametro posizione (primo) probabilmente si desidera utilizzare kCGSessionEventTap.
    b) Per il parametro di posizionamento (secondo) probabilmente si desidera kCGHeadInsertEventTap.
    c) Per il parametro maschera evento, provare (1 << kCGEventMouseMoved).

  2. Creare una sorgente di loop di esecuzione con CFMachPortCreateRunLoopSource, passando il rubinetto dell'evento come secondo parametro.

  3. Aggiungere l'origine del ciclo di esecuzione al ciclo di esecuzione. Supponendo che si desidera aggiungere al ciclo ciclo principale, fare: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

  4. Abilitare il rubinetto evento con CGEventTapEnable

+0

Grazie per l'aiuto. Capisco un po 'meglio i tap dell'evento ora. Ho finito per usare il metodo NSEvent di Ben, però. –

Problemi correlati