0 votos

Scripting de elementos arbitrarios de la barra de menús

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

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 estoy teniendo es cuando añado ese 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 esto de los scripts de UI y applescript.

4voto

qarma Puntos 71

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

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

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

Por lo tanto, si cambias 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ú de Apple (), que es menu bar item 1 of menu bar 1 para todas las aplicaciones en las que la barra de menú existe y es visible (aunque pertenece a la aplicación que está más adelante, por lo que intentar pedir a otro proceso de aplicación que haga clic en este elemento arrojará un error).

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

Para obtener el número de elementos de la barra de menús, utilice la función count comando:

    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 tell process activeApp bloque).

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

    set i to random number from 1 to N

Si lo unimos todo, el nuevo comando será algo parecido a esto:

    tell menu bar item i of menu bar 1 to click

Ahora cada vez que ejecute el script, se hará clic en un elemento aleatorio de la barra de menús haciendo que aparezca su menú.

Para ir más allá, y conseguir que tu script haga clic en un menu item En este caso, puedes aplicar exactamente los mismos principios que en el caso anterior, teniendo en cuenta la jerarquía que he establecido en la parte superior.

Por lo tanto, después de recuperar un elemento de la barra de menú al azar, a continuación, determinar el número máximo de menu items y generar 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

Entonces puedes hacer clic en él:

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

Aplicando los mismos principios a los submenús que existan para ese elemento de menú en particular, obtendrá lo siguiente:

    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, verás que esto -la mayoría de las veces- arrojará 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 los que no existe ningún submenú, pedir a AppleScript que cuente el número de elementos del menú [en un submenú inexistente] no es un comando sensato.

Hay dos maneras de manejar esto. O bien envolver esas líneas en un try...end try bloque de captura de errores, así:

    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 sólo 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...

Finalmente...

Es poco probable que sepa con exactitud cuántos niveles de profundidad tiene un determinado árbol de menús: ¿cuántos submenús dentro de submenús existen para un determinado elemento de menú? La respuesta es al menos 0, pero sin un máximo determinado, a menos que lo compruebe usted mismo de antemano.

Por suerte, podemos hacer que AppleScript haga la comprobación por nosotros. Después de elegir un menu bar item cada hijo que se genera a partir de esto (mirando la jerarquía que te mostré en la parte superior) es un menu seguido de un menu item . El menu como habrás notado, sólo viene en cuenta singular, por lo que siempre será referenciado como menu 1 . El menu items vienen en plural, y estos son los elementos que hay que contar.

Así que, simplemente, habiendo elegido un menu bar item , conseguimos que AppleScript haga lo siguiente:

  1. count el número de menu items contiene;
  2. Si este valor es 0, entonces no hay submenús, por lo que sólo podemos hacer clic en el elemento que tenemos;
  3. Si el valor es mayor que 0, entonces elige uno al azar;
  4. count el número de menu items este uno contiene;
  5. Si este valor es 0, basta con hacer clic en él;
  6. Si el valor es mayor que 0, entonces elige uno al azar;
  7. etc.

Este proceso es un bucle que puede continuar por tantos submenús como 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é desactivado. Estos, cuando se hace clic, no hacen nada.


TENGA CUIDADO: Hacer clic en un elemento del menú al azar antes de saber lo que hace puede dar lugar a algunos resultados no deseados. Por ejemplo, puede salir accidentalmente de la aplicación frontal; puede borrar un archivo o expulsar un disco si el scriptse ejecuta mientras Buscador está al frente; o puede cerrar la sesión o apagar el ordenador.

0 votos

¡Gracias por su ayuda! ¿Cómo puedo seleccionar, pero no hacer clic, un elemento (es decir, se resalta y puedo seleccionar uno diferente). ¿Existe un comando "mostrar" pero no hacer clic?

0 votos

@user279242 Puedes usar el select en lugar de click que resaltará el elemento de menú en cuestión como si pasara el puntero del ratón sobre él. Si un elemento de menú tiene un submenú, entonces puede emitir un click para mostrar su submenú.

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