Pregunta

¿Hay alguna forma de registrarse para eventos globales movidos por el mouse en Cocoa? Pude registrarme para los eventos usando InstallEventHandler() de Carbon, pero preferiría un equivalente de Cocoa. He buscado NSNotificationCenter eventos, pero no parece haber ningún nombre de evento público (¿hay nombres privados?)

Alternativamente, ¿hay alguna manera de usar NSTrackingArea para vistas con un fondo clearColor?

La aplicación es solo Snow Leopard.

¿Fue útil?

Solución

En SnowLeopard hay un nuevo método de clase en NSEvent que hace exactamente lo que quiere: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block. Usted & # 8217; querrá mask = NSMouseMovedMask.

Otros consejos

Ya se hizo una pregunta similar en StackOverflow: Cómo hacer un identificador de subclase NSView transparente eventos del mouse?

Para resumir, el método de vista transparente no funcionó. Los grifos de eventos de cuarzo parecen ser la mejor respuesta.

Aquí hay algunos consejos para trabajar con grifos:

  1. Cree el grifo con CGEventTapCreate.
    a) Para el parámetro de ubicación (primero) probablemente querrá usar kCGSessionEventTap.
    b) Para el parámetro de ubicación (segundo) probablemente querrá 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 tap como el segundo parámetro.

  3. Agregue la fuente del ciclo de ejecución a su ciclo de ejecución. Suponiendo que desea que se agregue al ciclo principal de ejecución, haga lo siguiente: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

  4. Habilite el evento toque con CGEventTapEnable

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top