6 votos

Cambie a una fuente de entrada específica en OS X en Catalina con AppleScript

Uso de diferentes distribuciones de teclado y cambiar entre ellos mediante un simple script

on changeKeyboardLayout(layoutName)
    tell application "System Events" to tell process "SystemUIServer"
        tell (1st menu bar item of menu bar 1 whose description is "text input") to {click, click (menu 1's menu item layoutName)}
    end tell
end changeKeyboardLayout
changeKeyboardLayout("German LaTeX2")

Que funcionó bien hasta la última actualización. Yo realmente no hablan de AppleScript, pero un poco de las pruebas indica que SystemUIServer ya no tiene acceso a un elemento de menú con el nombre de "entrada de texto". Tratando de

tell application "System Events" to tell process "SystemUIServer" to get value of attribute "AXDescription" of every menu bar item of menu bar 1

me da Siri, blutooth, time machine, clock , y en algunos otros. Así que de alguna manera el menú de fuente de entrada es administrado de forma diferente ahora, pero ahora tengo ni idea de cómo o cómo averiguar (todas las búsquedas me señaló secuencias de comandos similar a la mía)

Actualización 2019/12/10

Las soluciones sugeridas hasta ahora ambos tienen defectos, en un caso que siempre se obtiene un retardo de 5 segundos, lo que es bastante largo y el truco con el asesinato de "Eventos del Sistema" tomado de otra publicación no siempre parece funcionar, a veces resulta en la secuencia de comandos de conseguir un tiempo de espera (que es incluso peor que tener los 5 segundos de retardo todo el tiempo), así que parece como si este todavía está en necesidad de una solucion mejor

2voto

sunnyjim2479 Puntos 48

Para el registro, analizando la respuesta de cómo llegar al menú de fuente de entrada en Catalina con una respuesta que trata con el bug (?) generar un retardo de dar una versión que funcionan tan bien como la anterior lo hizo:

on changeKeyboardLayout(layoutName)
    launch application "System Events"
    delay 0.2
    ignoring application responses
        tell application "System Events" to tell process "TextInputMenuAgent"
            click menu bar item 1 of menu bar 2
        end tell
    end ignoring
    do shell script "killall System\\ Events"
    delay 0.1
    tell application "System Events" to tell process "TextInputMenuAgent"
        tell menu bar item 1 of menu bar 2
            click menu item layoutName of menu 1
        end tell
    end tell
end changeKeyboardLayout

changeKeyboardLayout("German LaTeX2")

Actualización 2019/12/10

El truco con el asesinato de "Eventos del Sistema" tomado de otra publicación no siempre parece funcionar, a veces resulta en la secuencia de comandos de conseguir un tiempo de espera (que es incluso peor que tener los 5 segundos de retardo todo el tiempo), así que parece como si la solución a mi pregunta sigue siendo algo abierto

2voto

user3439894 Puntos 5883

Por desgracia, las cosas han cambiado en macOS Catalina y usted"ll tiene que activar el menú de una manera diferente.

El siguiente ejemplo de AppleScript de código, se muestra más abajo, a mí me funciona en macOS Catalina, sin embargo, como se estaba probando en una máquina virtual y no sé si el tiempo de retraso en la ejecución del código, antes de hacer clic en el menú destino y el posterior código, es inherente a un problema en la máquina virtual o será el mismo en una máquina física.

No tengo alemana LaTeX2 lo que he usado alemán en su lugar, a pesar de la comodidad que ha sustituido en el código después de la prueba.

Las habituales advertencias se aplican para el uso de este en: Preferencias del Sistema > Seguridad y Privacidad > Privacidad > Accesibilidad

Ejemplo de AppleScript código:

tell application "System Events" to ¬
    tell application process "TextInputMenuAgent" to ¬
        tell menu bar item 1 of menu bar 2
            click
            click menu item "German LaTeX2" of menu 1
        end tell

Esto hace lo mismo de una manera diferente, y una de estas formas puede ser más rápido.

tell application "System Events" to ¬
    tell application process "TextInputMenuAgent" to ¬
        click menu bar item 1 of menu bar 2

tell application "System Events"
    keystroke "g"
    key code 36
end tell

Para utilizar el ejemplo de AppleScript código en un controlador:

changeKeyboardLayout("German LaTeX2")

on changeKeyboardLayout(layoutName)
    tell application "System Events" to ¬
        tell application process "TextInputMenuAgent" to ¬
            tell menu bar item 1 of menu bar 2
                click
                click menu item layoutName of menu 1
            end tell
end changeKeyboardLayout

O la segunda versión de el código:

changeKeyboardLayout("German LaTeX2")

on changeKeyboardLayout(layoutName)
    tell application "System Events" to ¬
        tell application process "TextInputMenuAgent" to ¬
            click menu bar item 1 of menu bar 2
    tell application "System Events"
        keystroke (first text item of layoutName)
        key code 36
    end tell
end changeKeyboardLayout

Nota: El ejemplo de AppleScript código es sólo eso y no contiene ningún error de manipulación como puede ser apropiado. La responsabilidad recae sobre el usuario para agregar cualquier error de manipulación como puede ser apropiado, necesitaba o quería. Echa un vistazo al tratar de instrucción y de error de instrucción en la Guía de Lenguaje de AppleScript. Véase también el Trabajo con los Errores.

1voto

qarma Puntos 71

Escribí este script hace un tiempo que utiliza un carbono API para cambiar el teclado de la fuente de entrada a través del sistema de bajo nivel de llamadas, que normalmente sería ideal y obviamente preferible manipular la interfaz de usuario. Dicho esto, se trata de un par de años, así que no podía decir si es o no es todavía va a ser viable en Catalina, no menos, ya que el carbono es el ser (o es) en desuso, pero el guión está escrito en JavaScript para la Automatización, la cual, como AppleScript, básicamente está cayendo a trozos.

Pero, voy a publicar de todos modos, sólo en caso de que no tienen valor en el más reciente de OS configuración:

ObjC.import('Carbon');

nil = $();

unwrap = ObjC.deepUnwrap.bind(ObjC);
bind = ObjC.bindFunction.bind(ObjC);
bind('CFMakeCollectable', [ 'id', [ 'void *' ] ]);
Ref.prototype.nsObject = function() {
    return unwrap($.CFMakeCollectable(this));
}


function run() {
    const lang = 'German';

    const currentSource = $.TISCopyCurrentKeyboardInputSource();
    const sources   = unwrap($.TISCreateInputSourceList(nil, false)),
          sourceIDs = sources.map(src => $.TISGetInputSourceProperty(
                                      src,'TISPropertyInputSourceID')
                             .nsObject()),
          sourceID  = sourceIDs.filter(src=>src.indexOf(lang)!==-1)[0],
          source    = unwrap($.TISCreateInputSourceList(
                            { 'TISPropertyInputSourceID' : sourceID },
                      false))[0];
    const status    = $.TISSelectInputSource(source);
    return (status==0);
}

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