grifos de eventos: resultados variables con CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent

StackOverflow https://stackoverflow.com/questions/553284

Pregunta

Estoy corriendo en un espinoso problema con la publicación de un evento de un grifo evento. Estoy tocando para NSSystemDefined en kCGHIDEventTap, volviendo a poner el evento con una nueva. El problema que estoy corriendo en a es que dependiendo de la forma en que publico el evento, que está siendo visto sólo por algunas aplicaciones. Mis aplicaciones de prueba son Opera, Firefox, Quicksilver, y Xcode. Estas son las diferentes técnicas que he probado en mi caso de devolución de llamada del grifo, con resultados. Estoy esperando una acción (la "respuesta correcta") de cada aplicación; "Pitido del sistema" significa la nada-es-determinado con el fin de que-clave-sonido del sistema.

  1. Crear un nuevo evento, y volverlo a partir de la devolución de llamada. Opera: no hay respuesta / sistema de sonido, Firefox: sin respuesta pitido / sistema, Quicksilver: la respuesta correcta, Xcode: no hay respuesta / sistema de sonido

  2. Crear un nuevo evento, puesto que kCGSessionEventTap con CGEventPost, devolver null. Opera: no hay respuesta / sistema de sonido, Firefox: sin respuesta pitido / sistema, Quicksilver: la respuesta correcta, Xcode: no hay respuesta / sistema de sonido

  3. Crear un nuevo evento, puesto que kCGAnnotatedSessionEventTap con CGEventPost, devolver null. Opera: la respuesta correcta, Firefox: la respuesta correcta, Quicksilver: no hay respuesta / sonido del sistema, Xcode: no hay respuesta / sistema de sonido

  4. Crear un nuevo evento, post con CGEventTapPostEvent, devolver null. Opera: no hay respuesta / sistema de sonido, Firefox: sin respuesta pitido / sistema, Quicksilver: la respuesta correcta, Xcode: no hay respuesta / sistema de sonido

  5. Crear un nuevo evento, puesto que kCGSessionEventTap con CGEventPost, y devolver nuevo evento. Opera: no hay respuesta / sistema de sonido, Firefox: sin respuesta pitido / sistema, Quicksilver: la respuesta correcta, Xcode: no hay respuesta / sistema de sonido

  6. Crear un nuevo evento, puesto que kCGAnnotatedSessionEventTap con CGEventPost, y devolver nuevo evento. Opera: respuesta correcta y sonido del sistema, Firefox: la respuesta correcta y sonido del sistema, Quicksilver: respuesta correcta y sonido del sistema, Xcode: no hay respuesta / doble sistema de sonido

  7. Crear un nuevo evento, publicar con CGEventTapPostEvent, y devolver nuevo evento. Opera: no hay respuesta / sistema de sonido, Firefox: sin respuesta pitido / sistema, Quicksilver: la respuesta correcta, Xcode: no hay respuesta / sistema de sonido

(6) es la mejor, pero los usuarios se quejan del sonido del sistema extra en las respuestas correctas, que yo supongo que viene de la doble contabilización del evento. No estoy seguro de otras combinaciones para tratar, o donde más que mirar. ¿Alguien puede ofrecer ningún tipo de orientación? ¿Hay alguna manera de obtener los resultados tanto de devolver el caso de mi devolución de llamada y el envío al grifo anotada sin hacer ambas cosas?

Lo siento por el largo que se trate; He estado haciendo mucha experimentación.

Gracias de antemano


Actualización: este es el código que utilizo para crear el grifo de eventos:

CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);
¿Fue útil?

Solución

Creo que me fijo esto. Había estado utilizando +[NSEvent keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:] para crear un NSEvent, a continuación, volver -CGEvent de ese evento. Cambié a CGEventCreateKeyboardEvent, utilizando la fuente del evento creado a partir del evento original con CGEventCreateSourceFromEvent, y devolver el caso de la devolución de llamada. Todos mis pruebas pasan ahora.

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