Scripts de elementos de barra de menús arbitrarios

-1

Así que realmente quiero arreglar este Applecript en el que estoy trabajando. Me gustaría poder hacer clic en un elemento arbitrario en un submenú arbitrario de un menú arbitrario en cualquier aplicación. Aquí es donde he conseguido:

tell application "System Events"
    set activeApp to name of first application process whose frontmost is true
end tell

tell application "System Events" to tell process activeApp
    tell menu bar item 1 of menu bar item 1 of menu bar 1
        click
    end tell
end tell

El problema que tengo es que cuando agrego el segundo "del elemento 1 de la barra de menú". Funcionó bien hasta que llegué a ese punto y ahora no sé qué hacer. Soy bastante nuevo en las secuencias de comandos de UI y Applecript.

    
pregunta Talos Potential 15.03.2018 - 04:56

1 respuesta

2

La jerarquía del objeto menu bar es así:

menu bar > menu bar item > menu > menu item [ > menu > menu item [...] ]

donde los corchetes indican posibles submenús, en caso de que existan.

Por lo tanto, si cambia esta línea:

    tell menu bar item 1 of menu bar item 1 of menu bar 1

a esto:

    tell menu 1 of menu bar item 1 of menu bar 1

funcionará.

Esto, por supuesto, siempre hará clic en el menú Apple (), que es menu bar item 1 of menu bar 1 para todas las aplicaciones en las que existe la barra de menús y está visible (aunque pertenece a la aplicación que está más adelante, por lo que se intenta preguntar a otro). proceso de solicitud para hacer clic en este elemento producirá un error).

Si desea hacer clic en un elemento de menú arbitrario en la barra de menú para revelar su menú, debe reemplazar el número de índice 1 del menu bar item con un valor aleatorio, pero uno que no exceda el número de disponible menu bar items .

Para obtener el número de elementos de la barra de menú, use el comando count :

    set N to count menu bar items of menu bar 1 of activeApp

(Puede omitir of activeApp si el comando se coloca dentro de un bloque tell process activeApp ).

Para obtener un número aleatorio entre 1 y N , usa el comando random number :

    set i to random number from 1 to N

Poniendo todo junto, su nuevo comando tendrá un aspecto similar al siguiente:

    tell menu bar item i of menu bar 1 to click

Ahora, cada vez que ejecute el script, se hará clic en un elemento de la barra de menú al azar para que aparezca su menú.

Para ir aún más lejos, y hacer que su script haga clic en un menu item al azar, puede aplicar exactamente los mismos principios que arriba, teniendo en cuenta la jerarquía que coloqué en la parte superior.

Entonces, después de recuperar un elemento de la barra de menú aleatorio, a continuación, determine el número máximo de menu items y genere un número aleatorio menor o igual a este máximo:

    set M to count menu items of menu 1 of menu bar item i of menu bar 1
    set j to random number from 1 to M

Luego puedes hacer clic en él:

    click menu item j of menu 1 of menu bar item i of menu bar 1

Al aplicar los mismos principios a cualquier submenú que exista para ese elemento de menú en particular, terminará con esto:

    set L to count menu items of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
    set k to random number from 1 to L
    click menu item k of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1

Sin embargo, encontrará que esto, con más frecuencia que no, generará un error al intentar set L . Esto se debe a que no todos los elementos del menú tendrán submenús, y en los casos en que no existe un submenú, pedirle a AppleScript que cuente el número de elementos del menú [en un submenú no existente] no es un comando razonable.

Hay dos maneras de manejar esto. O bien enrolle esas líneas en un bloque de captura de error try...end try , como este:

    try
        set L to count menu items of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
        set k to random number from 1 to L
        click menu item k of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
    end try

o count el número de (sub) menús de menu item j , y solo proceder si este número es mayor que 0:

    count menus of menu item j of menu 1 of menu bar item i of menu bar 1

    if the result > 0 then
        set L to count menu items of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
        set k to random number from 1 to L
        click menu item k of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
    end if

Y así sucesivamente, y así sucesivamente ...

Finalmente ...

Es poco probable que sepa exactamente cuántos niveles de profundidad abarca un árbol de menús: ¿cuántos submenús dentro de los submenús existen para un elemento de menú en particular? La respuesta es al menos 0, pero sin un máximo dado, a menos que lo haga con anticipación.

Afortunadamente, podemos hacer que AppleScript haga la comprobación por nosotros. Después de elegir un menu bar item aleatorio, cada niño que se genera a partir de esto (observando la jerarquía que te mostré en la parte superior) es un menu seguido de un menu item . El objeto menu , como habrás notado, solo viene en un recuento singular, por lo que siempre se hará referencia a menu 1 . Los menu items vienen en plural, y estos son los elementos que se deben contar.

Entonces, simplemente, habiendo elegido un menu bar item al azar, conseguimos que AppleScript haga lo siguiente:

  1. count el número de menu items que contiene;
  2. Si este valor es 0, entonces no hay submenús, así que solo podemos hacer clic en el elemento que tenemos;
  3. Si el valor es mayor que 0, elija uno aleatorio;
  4. count la cantidad de menu items que esta contiene;
  5. Si este valor es 0, simplemente haz clic en él;
  6. Si el valor es mayor que 0, elija uno aleatorio;
  7. etc ...

Este proceso es un bucle que puede continuar en todos los submenús que encuentre. Y eso es lo que hace este código:

    tell application "System Events" to ¬
        tell (the first application process ¬
            whose frontmost is true)

            set m to it
            set _m to the menu bar items of menu bar 1

            repeat
                if not (exists _m) then exit repeat

                set i to random number from 1 to (count _m)

                set m to item i of _m
                set _m to a reference to menu items of menu 1 of m
            end repeat

            click m

        end tell

Advertencia: Las líneas horizontales que separan las secciones de un menú también se clasifican como menu items , al igual que cualquier elemento del menú que esté deshabilitado. Estos, al hacer clic, no hacen nada.

TENGA CUIDADO: Al hacer clic en un elemento del menú de forma aleatoria antes de saber qué hace puede dar lugar a algunos resultados no deseados. Por ejemplo, puede abandonar accidentalmente la aplicación frontal; puede eliminar un archivo o expulsar un disco si el script se ejecuta mientras Finder está al frente; o puede cerrar sesión o apagar su computadora.

    
respondido por el CJK 15.03.2018 - 07:21

Lea otras preguntas en las etiquetas