grifos de eventos: resultados variables con CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent
-
23-08-2019 - |
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.
-
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
-
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
-
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
-
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
-
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
-
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
-
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);
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.