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:
-
menu bar item
il numero di count
che contiene;
- Se questo valore è 0, non ci sono sottomenu, quindi possiamo semplicemente fare clic sull'elemento che abbiamo;
- Se il valore è maggiore di 0, scegli uno casuale;
-
menu items
il numero di count
questo quello che contiene;
- Se questo valore è 0, basta fare clic su di esso;
- Se il valore è maggiore di 0, scegli uno casuale;
- 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.