1 votos

Uso de la línea de comandos para activar el Control de Interruptores

Para activar Control de interruptores en Configuración, hago clic en la casilla situada en Accesibilidad -> Control de Interruptores -> Habilitar Control de Interruptores (al menos en Catalina). Si quiero que un programa abra el Control de Interruptores y automatice ese proceso, tengo que navegar por la aplicación de Preferencias del Sistema (lo que podría hacer con AppleScript). Estaría bien que hubiera un comando que pudiera ejecutar en el terminal para abrir directamente la aplicación del Panel de Control de Interruptores. No he podido encontrar ninguno en mi investigación.

Lo que he probado:

He seguido las instrucciones de esta respuesta . Si hubiera funcionado como yo quería, podría haber cambiado la configuración del "Control del interruptor" editando su correspondiente archivo .plist (sudo defaults write). Cuando probé este enfoque con el ejemplo proporcionado en la respuesta (cambiando "Mostrar ventana de inicio de sesión como:" de "Lista de usuarios" a "Nombre y contraseña") funcionó bien. No funcionó cuando lo probé cambiando la configuración de "Habilitar el control del interruptor".

Siguiendo las instrucciones, hice una copia de la carpeta de preferencias y los archivos de configuración plist adjuntos:

$ sudo cp -r /Library/Preferences before

Después de cambiar la configuración de Control de Interruptores y salir de Preferencias del Sistema, hice una nueva copia:

$ sudo cp -r /Library/Preferences after

A continuación, para ver qué archivos han cambiado, he probado:

$ sudo diff -ur before after

que no devuelve ningún mensaje "Los archivos binarios difieren".

A continuación, intenté utilizar el Monitor de Actividad para averiguar qué programas se ejecutan cuando "Activar el Control de Interruptores" está activado. Encontré una aplicación en ejecución llamada Assistive Control (AssistiveControl en el Monitor de Actividad).

Corrí $ ps aux y encontré esto en la columna COMANDO:

/System/Library/Input Methods/Assistive Control.app/Contents/MacOS/Assistive Control launchd -s

Cuando intento ejecutar el comando con el Control de Cambios desactivado en las Preferencias del Sistema, no hace nada. Cuando intento ejecutar el comando con el Control de Interruptores activado, obtengo este error: invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.

¿Cómo puedo utilizar la línea de comandos para activar el Control de Interruptores?

Sería genial si alguien pudiera ayudarme o darme sugerencias.

1voto

user3439894 Puntos 5883

Aquí hay un camino desde el línea de comandos en, por ejemplo, Terminal para encender Control de interruptores utilizando un shell script utilizando AppleScript con Guiones de interfaz de usuario para hacer clic de forma programada en el Activar el control del interruptor casilla de verificación en: Preferencias del sistema > Accesibilidad > Control de interruptores

El ejemplo AppleScript código que se muestra a continuación, se probó en script Editor y como ejecutable shell script en Terminal en MacOS Catalina con Lengua y región ajustes en Preferencias del sistema ajustado a Inglés (EE.UU.) - Primaria y me ha funcionado sin problemas 1 .

  • 1 Asume los ajustes necesarios y apropiados en <strong>Preferencias del sistema </strong>> <strong>Seguridad y privacidad </strong>> <strong>Privacidad </strong>se han fijado/abordado según las necesidades.

Tenga en cuenta que la codificación en este shell script asume que Control de interruptores se ha encendido previamente de forma manual para responder a la Preferencias del sistema intenta desbloquear las preferencias de accesibilidad cuadro de diálogo donde ha introducido su Nombre de usuario y Contraseña luego hizo clic en el Desbloquear botón.

Después de configurar el shell script y los ajustes de direccionamiento mencionados anteriormente 1 Será tan sencillo como teclear, por ejemplo esc en, por ejemplo, Terminal para abrir Control de interruptores .

Es Terminal Escriba lo siguiente comando compuesto y a continuación pulse entrar en :

f="esc"; touch "$f"; open -e "$f"; chmod +x "$f"

Copiar y pegar el ejemplo AppleScript código que se muestra a continuación, en el esc documento, (llamado así por [E]nable [S]bruja [C]ontrol ), luego guárdelo y cierre el documento.

A continuación, debe mover el esc ejecutable shell script a un directorio que figura en la lista de PATH pasado a la shell . Yo tengo el mío en /usr/local/bin/ .


Ejemplo AppleScript código :

#!/usr/bin/osascript

--  # Check to see if System Preferences is 
--  # running and if yes, then close it.
--  # 
--  # This is done so the script will not fail 
--  # if it is running and a modal sheet is 
--  # showing, hence the use of 'killall' 
--  # as 'quit' fails when done so, if it is.
--  #
--  # This is also done to allow default behaviors
--  # to be predictable from a clean occurrence.

if running of application "System Preferences" then
    try
        tell application "System Preferences" to quit
    on error
        do shell script "killall 'System Preferences'"
    end try
    delay 0.1
end if

--  # Make sure System Preferences is not running before
--  # opening it again. Otherwise there can be an issue
--  # when trying to reopen it while it's actually closing.

repeat while running of application "System Preferences" is true
    delay 0.1
end repeat

--  # Open System Preferences to the Accessibility pane.

tell application "System Preferences" to ¬
    reveal pane id "com.apple.preference.universalaccess"

--  # Use System Events to achieve the goal.

tell application "System Events"
    tell window 1 of application process "System Preferences"

        --  # Wait for target pane to be available.
        --  # The target in this case has a checkbox.

        my waitForUIelement(checkbox 1)

        --  # Ascertain the target row to select.

        set rowSwitchControl to the first row of ¬
            table 1 of scroll area 1 whose value of ¬
            static text 1 of UI element 1 is ¬
            "Switch Control"

        --  # Select the target row.

        select rowSwitchControl

        --  # Wait for target checkbox to be available.

        my waitForUIelement(checkbox 1 of tab group 1 of group 1)

        --  # Click the Enable Switch Control checkbox.

        click checkbox 1 of tab group 1 of group 1

    end tell
end tell

delay 0.02

quit application "System Preferences"

--  ## Handler(s) ##

on waitForUIelement(uiElement)
    tell application "System Events"
        tell window 1 of application process ¬
            "System Preferences"
            set i to 0
            repeat until exists uiElement
                delay 0.1
                set i to i + 1
                if i  30 then return
            end repeat
        end tell
    end tell
end waitForUIelement

Notas:

El ejemplo AppleScript código se haga clic en el objetivo casilla de verificación para permitir Control de interruptores Sin embargo, tal y como está codificado no muestra el UI cuando Preferencias del sistema se abre para hacerlo. Como resultado, no se desmarcará el casilla de verificación para desactivar Control de interruptores . Eso tendrá que hacerlo mi cerrar manualmente Control de interruptores .

El ejemplo AppleScript código se puede modificar para desmarcar el casilla de verificación para desactivar Control de interruptores Sin embargo, para ello será necesario mostrar el UI de Preferencias del sistema . Si necesitas que haga ambas cosas y no te importa ver Preferencias del sistema parpadea en la pantalla durante uno o dos segundos, y luego utiliza el ejemplo AppleScript código muestran debajo de estas notas.

Dicho esto, a pesar de todo, se verá el Azulejos de muelle rebote una vez en el Muelle cuando el shell script se ejecuta y esto no se puede evitar.

Si bien esto puede lograr el objetivo de permitir Control de interruptores de la línea de comandos No obstante, Guiones de interfaz de usuario la escritura puede ser kludgy y propensos a fallar como el estructura jerárquica de los elementos de la interfaz de usuario cambios con las actualizaciones del OS o aplicaciones involucradas. En otras palabras, lo que funciona, por ejemplo, en MacOS Catalina puede necesitar ser ajustado para su uso en, por ejemplo, MacOS Big Sur .


Actualizar para cambiar el estado de la casilla Habilitar control de interruptores .

Ejemplo AppleScript código :

#!/usr/bin/osascript

--  # Check to see if System Preferences is 
--  # running and if yes, then close it.
--  # 
--  # This is done so the script will not fail 
--  # if it is running and a modal sheet is 
--  # showing, hence the use of 'killall' 
--  # as 'quit' fails when done so, if it is.
--  #
--  # This is also done to allow default behaviors
--  # to be predictable from a clean occurrence.

if running of application "System Preferences" then
    try
        tell application "System Preferences" to quit
    on error
        do shell script "killall 'System Preferences'"
    end try
    delay 0.1
end if

--  # Make sure System Preferences is not running before
--  # opening it again. Otherwise there can be an issue
--  # when trying to reopen it while it's actually closing.

repeat while running of application "System Preferences" is true
    delay 0.1
end repeat

--  # Open System Preferences to the Accessibility pane.

tell application "System Preferences" to ¬
    reveal pane id "com.apple.preference.universalaccess"

tell application "Sysem Preferences" to activate

--  # Use System Events to achive the goal.

tell application "System Events"
    tell window 1 of application process "System Preferences"

        --  # Wait for target pane to be available.
        --  # The target in this case has a checkbox.

        my waitForUIelement(checkbox 1)

        --  # Ascertain the target row to select.

        set rowSwitchControl to the first row of ¬
            table 1 of scroll area 1 whose value of ¬
            static text 1 of UI element 1 is ¬
            "Switch Control"

        --  # Select the target row.

        select rowSwitchControl

        --  # Wait for target checkbox to be available.

        my waitForUIelement(checkbox 1 of tab group 1 of group 1)

        --  # Check to see if the Enable Switch Control
        --  # checkbox is checked, and if it is, then
        --  # uncheck it. Otherwise check it.       

        if the value of checkbox 1 of tab group 1 of group 1 is 1 then

            --  # The Enable Switch Control checkbox is checked.
            --  # Click the Enable Switch Control checkbox.

            click checkbox 1 of tab group 1 of group 1

            --  # Wait for OK button to be available.

            my waitForUIelement(button 1 of sheet 1)

            --  # Click the OK button..

            click button "OK" of sheet 1

        else
            --  # The Enable Switch Control checkbox is not checked.
            --  # Click the Enable Switch Control checkbox.

            click checkbox 1 of tab group 1 of group 1
        end if

    end tell
end tell

delay 0.02

quit application "System Preferences"

--  ## Handler(s) ##

on waitForUIelement(uiElement)
    tell application "System Events"
        tell window 1 of application process ¬
            "System Preferences"
            set i to 0
            repeat until exists uiElement
                delay 0.1
                set i to i + 1
                if i  30 then return
            end repeat
        end tell
    end tell
end waitForUIelement

Nota: El <em>ejemplo </em><strong>AppleScript </strong><em>código </em>es sólo eso y sin ningún tipo de inclusión <em>tratamiento de errores </em>no contiene ningún otro <em>tratamiento de errores </em>según corresponda. Corresponde al usuario añadir cualquier <em>tratamiento de errores </em>como sea apropiado, necesario o deseado. Eche un vistazo a la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>intente </strong></a><em>declaración </em>y <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>error </strong></a><em>declaración </em>en el <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guía del lenguaje AppleScript </strong></a>. Véase también, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Trabajar con errores </strong></a>. Además, el uso del <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW10" rel="nofollow noreferrer"><strong>retraso </strong></a><em>comando </em>puede ser necesario entre eventos cuando sea apropiado, por ejemplo <code>delay 0.5</code> con el <em>valor </em>de la <em>retraso </em>ajustado apropiadamente.

0voto

benwiggy Puntos 8

¿Está seguro de que los prefijos de accesibilidad se almacenan en /Library y no ~/Library (la biblioteca del usuario)?

Cuando quiero descubrir una clave plist, suelo hacer el cambio en Preferencias del Sistema, y luego ordeno la carpeta de Preferencias del usuario por Fecha de Modificación. Eso reduce la lista a unos pocos archivos, que espero que tengan un nombre útil.

Probando con el control de Switch, noto que algunos plists relevantes se modifican:

com.apple.universalaccess.plist
com.apple.Accessibility.plist
com.apple.HIToolbox.plist
com.apple.AssistiveControl.switch.plist

Sin embargo, no estoy seguro de lo que se cambia exactamente, y puede ser más de una cosa.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X