macos - ¿Alternativas para CGEventPostToPSN() para activar un elemento del menú de otra aplicación en un entorno de espacio aislado?
cocoa background (2)
Tengo esta aplicación donde necesito activar el elemento del menú de otra aplicación (como Imprimir cmd + p) desde dentro de mi aplicación. Ahora mismo estoy usando CGEventPostToPSN () para hacer el trabajo y funciona bien, pero cuando activo el sandboxing, deja de funcionar.
CGEventPostToPSN(&psn, keyDownEvent);
CFRelease(keyDownEvent);
CGEventPostToPSN(&psn, keyUpEvent);
CFRelease(keyUpEvent);
Mi pregunta ahora es: ¿qué puedo hacer cuando necesito habilitar el sandboxing? Escuché mucho sobre la API de accesibilidad, pero no pude averiguar cómo puedo activar un elemento del menú de otra aplicación. Estoy agradecido por cualquier respuesta a este problema.
fabianista
En un entorno de espacio aislado, aún puede enviar eventos de Apple a otra aplicación; solo necesita solicitar una "Excepción temporal de evento de Apple" para su aplicación. Esto se detalla en la Referencia de clave de elemento de Apple en la sección "Excepción temporal del evento de Apple".
Excepción temporal del evento de Apple
Cuando adopta la aplicación Sandbox, su aplicación conserva la capacidad de:
● Recibir eventos de Apple
● Enviar eventos de Apple a sí mismo
● Responder a los eventos de Apple que recibe.
Sin embargo, con App Sandbox no puede enviar eventos de Apple a otras aplicaciones a menos que configure el derecho de excepción temporal de eventos de Apple.Para cada aplicación a la que desee enviar eventos de Apple, especifique el identificador del paquete de la aplicación, en todos los caracteres en minúscula, como un valor de cadena para la matriz de valores de esta clave de derechos. Por ejemplo, para habilitar el envío de eventos de Apple a iPhoto desde su aplicación, use el valor de cadena com.apple.iphoto.
Capacidad de clave de derecho
com.apple.security.temporary-exception.apple-events
Permite enviarcom.apple.security.temporary-exception.apple-events
de Apple a una o más aplicaciones de destino.
Por lo que sé, Apple no ha definido explícitamente ''temporal'' en este contexto, pero el consenso es que Apple lo permite por ahora, pero que alguna futura tienda de aplicaciones o actualización de Mac OS X puede eliminar la posibilidad de hacerlo.
Tenga en cuenta que debe indicar explícitamente de antemano las aplicaciones a las que necesita poder enviar eventos; su aplicación o el usuario no pueden seleccionarlas dinámicamente en tiempo de ejecución.
Todavía no tengo una respuesta final a esta pregunta, pero parece ser posible con la API de accesibilidad como lo sugiere @nielsbot.
Hay algunas funciones prometedoras como AXUIElementPostKeyboardEvent()
y AXUIElementPerformAction()
. Problema: el uso de la API de accesibilidad para controlar otra aplicación está prohibido en la Guía de Sandbox de Apple.
Nota: Con la aplicación Sandbox, puede y debe habilitar su aplicación para accesibilidad, como se describe en este documento. Sin embargo, no puede crear una aplicación auxiliar como un lector de pantalla y no puede usar una aplicación que controle otra aplicación.
Si se encontró con esta pregunta y tiene el mismo problema que yo, me temo que no tendrá suerte. Reconsidere si realmente tiene que controlar otra aplicación y, de ser así, es posible que no pueda distribuir su aplicación en la Mac App Store, lo siento.
fabianista