2009-10-27 13 views
10

¿Hay alguna forma de registrarse para los eventos de mouse global movidos en Cocoa? Pude registrarme para los eventos usando el InstallEventHandler() de Carbon, pero preferiría un equivalente de Cacao. He buscado NSNotificationCenter eventos, pero no parece haber ninguna nombres de eventos públicos (hay las privadas?)Eventos de Mouse Moved Global en Cocoa

Por otra parte, hay una manera de utilizar NSTrackingArea de puntos de vista con un fondo clearColor?

La aplicación es solo Snow Leopard.

Respuesta

23

En SnowLeopard hay un nuevo método de clase en NSEvent que hace exactamente lo que desea: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block. Querrá mask = NSMouseMovedMask.

+1

Perfecto, exactamente lo que estaba buscando. Bonificación por usar bloques. 3 líneas de código donde los demás tomaron 20ish. –

3

Si desea rastrear el mouse sin importar dónde se encuentre, desea un CGEventTap. No hay equivalente de cacao Si solo desea rastrearlo en su aplicación, debe explicar por qué no puede hacerlo un poco más a fondo.

+0

grifos de eventos son definitivamente el camino a seguir. Funciona perfectamente para mi – Leibowitzn

+0

Esto funcionó perfectamente para mí, pero la respuesta de Ben fue definitivamente lo que estaba buscando. –

11

Una pregunta similar ya se pidió en StackOverflow: How to make a transparent NSView subclass handle mouse events?

En resumen, el método vista tansparent no funcionó. Quartz Event Taps parece ser la mejor respuesta.

Éstos son algunos consejos sobre cómo trabajar con los grifos:

  1. Cree el grifo con CGEventTapCreate.
    a) Para el parámetro de ubicación (primero), es probable que desee utilizar kCGSessionEventTap.
    b) Para el parámetro de ubicación (segundo), es probable que desee kCGHeadInsertEventTap.
    c) Para el parámetro de máscara de evento, intente (1 << kCGEventMouseMoved).

  2. Cree una fuente de bucle de ejecución con CFMachPortCreateRunLoopSource, pasando el evento como el segundo parámetro.

  3. Agregue la fuente de bucle de ejecución a su ciclo de ejecución. Suponiendo que desea que se sumó al bucle principal de ejecución, hacer: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

  4. Habilitar el grifo evento con CGEventTapEnable

+0

Gracias por la ayuda. Entiendo que los eventos ahora mejoran un poco. Sin embargo, terminé usando el método NSEvent de Ben. –

Cuestiones relacionadas