objective c - Habilitar el acceso para dispositivos de asistencia mediante programación
objective-c cocoa (4)
Quiero habilitar Access para dispositivos de asistencia en Preferencias del Sistema mediante programación. Pero el problema es que mi aplicación no se ejecuta como usuario root y no quiero que mi aplicación sea como usuario root y tampoco debería solicitar ninguna autenticación intermedia.
Quiero tocar todos los eventos de teclado globalmente. Estoy usando CGEventTapCreate () para lo mismo. En la documentación de la API CGEventTapCreate () se menciona que, las pulsaciones de eventos reciben eventos de tecla arriba y de tecla si se cumple una de las siguientes condiciones:
- El proceso actual se está ejecutando como el usuario raíz.
- El acceso para dispositivos de asistencia está habilitado. En Mac OS X v10.4 y posterior, puede habilitar esta función usando Preferencias del sistema, Panel de acceso universal, Vista de teclado.
Lo intenté manualmente al marcar Habilitar acceso para dispositivos de asistencia desde la preferencia del sistema y me da el resultado esperado.
Entonces, ¿hay alguna forma de hacer lo mismo a través del programa sin pedir autenticación y la aplicación no se ejecuta como usuario raíz?
Gracias,
Dheeraj.
Por lo general, se considera descortés cambiar la configuración del sistema de un usuario sin, por lo menos, decirles, si no se solicita permiso explícitamente. La mayoría de las aplicaciones que necesitan esta configuración solo verifican si está habilitada y, de no ser así, le dicen al usuario que la active.
Puede ejecutar un Applescript (o traducir el Applescript en ScriptingBridge o lo que sea que su capa Objective-C sobre AppleEvents sea)
Aquí hay un Applescript que uso en un proyecto en particular que hace algo similar a lo que necesita:
on isUIScriptingOn()
tell application "System Events" to set isUIScriptingEnabled to UI elements enabled
return isUIScriptingEnabled
end isUIScriptingOn
on turnUIScriptingOn(switch)
tell application "System Events"
activate
set UI elements enabled to switch
end tell
end turnUIScriptingOn
on run
if not isUIScriptingOn() then
display dialog "Enable Access for assistive devices (found in the Universal Access System Preference) must be on for this software to correctly work. This program will enable this setting for you"
turnUIScriptingOn(true)
display dialog "Access for assistive devices in now on"
end if
end run
Hay una forma de habilitarlo por proceso. Lamentablemente, no sé qué es, tengo aplicaciones que hacen esto y creo que recuerdo haber visto algo al respecto en la lista de correo de dev de cocoa.
¿Está seguro de que es posible habilitarlo por proceso, sin necesidad de tener derechos de administrador? Y si es así, ¿todos los eventos serán capturas, o solo los que pertenecen al proceso?
Ok todos ustedes la solución / alguna información de fondo se puede encontrar en esta dirección ..
Entonces, a Apple se le ocurrió otra solución en Tiger que resuelve estos problemas: la función mágica AXMakeProcessTrusted . Eso habilitará la API solo para su aplicación y necesita ser llamado desde un proceso que se ejecuta como raíz, por lo que es seguro . También es automático, por lo que además de pedirle al usuario su contraseña, el usuario no necesita hacer nada. El problema es que parece que nadie lo usa. Todas las aplicaciones de terceros que he visto e incluso Automator solo le piden al usuario que marque manualmente el cuadro en Preferencias del Sistema. Es más trabajo implementarlo y tiene un gran error no documentado (la aplicación debe ser relanzada antes de que realmente sea confiable Actualización: informada como # 5711990), pero realmente creo que la gente debería usarla. Entonces, pensé que lanzaría el código para que sea fácil de implementar en tu aplicación. Incluye un agente auxiliar que debería poder incluir en su proyecto.