Scripting di elementi della barra di menu arbitrari

-1

Quindi voglio davvero aggiustare questo applecript su cui sto lavorando. Vorrei poter fare clic su un elemento arbitrario in un sottomenu arbitrario di un menu arbitrario in qualsiasi applicazione. Ecco dove ho ottenuto:

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

Il problema che sto ottenendo è quando aggiungo quel secondo "elemento della barra dei menu 1". Ha funzionato bene fino a quando sono arrivato a quel punto e ora non so cosa fare? Sono abbastanza nuovo nello scripting dell'interfaccia utente e nel applescript.

    
posta Talos Potential 15.03.2018 - 04:56
fonte

1 risposta

2

La gerarchia dell'oggetto menu bar procede in questo modo:

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

dove le parentesi quadre indicano possibili sottomenu, se esistono.

Pertanto, se modifichi questa linea:

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

a questo:

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

funzionerà.

Questo, naturalmente, farà sempre clic sul menu Apple (), che è menu bar item 1 of menu bar 1 per tutte le applicazioni in cui la barra dei menu esiste ed è visibile (sebbene appartenga a qualsiasi applicazione sia in primo piano, quindi tentare di chiedere un altro processo di applicazione per fare clic su questo elemento genererà un errore).

Se desideri fare clic su una voce di menu arbitraria nella barra dei menu per mostrare il suo menu, devi sostituire il numero indice 1 di menu bar item con un valore casuale, ma uno che non supera il numero di disponibile menu bar items .

Per ottenere il numero di elementi della barra dei menu, utilizza il comando count :

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

(Puoi omettere of activeApp se il comando è inserito in un blocco tell process activeApp .)

Per ottenere un numero casuale compreso tra 1 e N , utilizza il comando random number :

    set i to random number from 1 to N

Mettendo tutto insieme, il tuo nuovo comando sarà simile a questo:

    tell menu bar item i of menu bar 1 to click

Ora ogni volta che esegui lo script, verrà fatto clic su un elemento della barra di menu casuale che fa apparire il suo menu.

Per andare ancora oltre, e fare in modo che il tuo script faccia clic su un menu item casuale, puoi applicare esattamente gli stessi principi di cui sopra, tenendo presente la gerarchia che ho disposto in alto.

Quindi, dopo aver recuperato una barra di menu casuale, determina il numero massimo di menu items e genera un numero casuale inferiore o uguale a questo massimo:

    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

Quindi puoi fare clic su di esso:

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

Applicando gli stessi principi a tutti i sottomenu esistenti per quella particolare voce di menu, ti ritroverai con questo:

    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

Tuttavia, scoprirai che questo, molto spesso, genera un errore quando provi a set L . Questo perché non tutte le voci di menu avranno sottomenu e nei casi in cui non esiste alcun sottomenu, chiedere ad AppleScript di contare il numero di voci di menu [in un sottomenu inesistente] non è un comando ragionevole.

Ci sono due modi per gestirlo. Inclina le righe in un blocco di try...end try che cattura l'errore, in questo modo:

    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 il numero di (sotto) menu di menu item j , e procedi solo se questo numero è maggiore di 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

E così via, e così via ...

Infine ...

È improbabile che tu sappia con precisione quanti livelli in profondità porta una particolare struttura di menu: quanti sottomenu all'interno di sottomenu esistono per una particolare voce di menu? La risposta è almeno 0, ma senza un massimo dato a meno che tu non controlli in anticipo te stesso.

Fortunatamente, possiamo fare affidamento su AppleScript per noi. Dopo aver selezionato un menu bar item casuale, ogni bambino che spawn da questo (guardando la gerarchia che ti ho mostrato in alto) è un menu seguito da un menu item . L'oggetto menu , come avrai notato, viene fornito con un conteggio unico, quindi verrà sempre referenziato come menu 1 . Il menu items è al plurale e questi sono gli elementi che devono essere conteggiati.

Quindi, semplicemente, dopo aver scelto un% casuale di% co_de, otteniamo che AppleScript faccia quanto segue:

  1. menu bar item il numero di count che contiene;
  2. Se questo valore è 0, non ci sono sottomenu, quindi possiamo semplicemente fare clic sull'elemento che abbiamo;
  3. Se il valore è maggiore di 0, scegli uno casuale;
  4. menu items il numero di count questo quello che contiene;
  5. Se questo valore è 0, basta fare clic su di esso;
  6. Se il valore è maggiore di 0, scegli uno casuale;
  7. etc ..

Questo processo è un ciclo che può andare avanti per tutti i sottomenu che trova. E questo è ciò che fa questo codice:

    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

Avvertenza: anche le linee orizzontali che separano le sezioni di un menu sono classificate come menu items , così come tutte le voci di menu che sono disabilitate. Questi, quando cliccato, non fanno nulla.

ATTENZIONE: Fare clic su una voce di menu casualmente prima di sapere che cosa può causare alcuni risultati indesiderati. Ad esempio, potresti chiudere accidentalmente l'applicazione anteriore; è possibile eliminare un file o espellere un disco se lo script viene eseguito mentre Finder è in primo piano; oppure puoi uscire o spegnere il tuo computer.

    
risposta data 15.03.2018 - 07:21
fonte

Leggi altre domande sui tag