In Applescript, come posso sapere se una voce di menu è selezionato/a fuoco?
-
09-06-2019 - |
Domanda
Ho uno script per OS X 10.5 che si concentra la casella di Ricerca nel menu di Aiuto di qualsiasi applicazione.Ce l'ho su una combinazione di tasti e, molto simile a Spotlight, voglio passare quando ho eseguito lo script.Quindi, voglio rilevare se la casella di ricerca è già concentrato per la digitazione e, in caso affermativo, tipo di Esc invece di fare clic sul menu Aiuto.
Questo è lo script così com'è ora:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
click helpMenuItem
end tell
end tell
E sto pensando a qualcosa di simile a questo:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
set searchBox to menu item 1 of menu of helpMenuItem
if (searchBox's focused) = true then
key code 53 -- type esc
else
click helpMenuItem
end if
end tell
end tell
...ma mi da questo errore:
Non è possibile ottenere concentrato di {voce di menu 1 menu "Aiuto" della barra dei menu la voce "Aiuto" della barra dei menu 1 del processo di applicazione "Script Editor" di applicazione "Eventi di Sistema"}.
Quindi, c'è un modo che posso ottenere il mio script per rilevare se la casella di ricerca è già concentrato?
Ho risolto il mio problema lavorare intorno ad esso.Ancora non so come controllare se una voce di menu viene selezionata anche se, così lascio questo topic aperto.
Soluzione
Utilizzando /Developer/Applications/Utilities/Accessibilità Strumenti/Impostazioni Accessibilità.app è possibile utilizzare il built-in sistema dell'accessibilità a guardare le proprietà dell'elemento dell'interfaccia utente sotto il mouse.Prendere nota speciale di cmd-F7 azione per bloccare la messa a fuoco di un elemento e il pulsante di Aggiornamento.Purtroppo l'elemento e struttura nomi non corrispondono a quelli in script suite, ma si può guardare il dizionario per gli Eventi di Sistema o di solito indovinare la giusta terminologia.
Utilizzando questa opzione, è possibile determinare due cose.Primo, il focused
la struttura non è in menu item
, ma , piuttosto, c'è un text field
entro il menu item
che è a fuoco.Secondo, la voce di menu ha una selected
proprietà.
Con questo, mi è venuta:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
-- Use reference form to avoid building intermediate object specifiers, which Accessibility apparently isn't good at resolving after the fact.
set searchBox to a reference to menu item 1 of menu of helpMenuItem
set searchField to a reference to text field 1 of searchBox
if searchField's focused is true then
key code 53 -- type esc
else
click helpMenuItem
end if
end tell
end tell
Se questo ancora non funziona.L'evento chiave non spara per quanto posso dire, quindi qualcosa potrebbe ancora essere hinky con il focused
proprietà del campo di testo.
In ogni caso, il click
di nuovo la soluzione sembra molto più facile.
Altri suggerimenti
Il costruito nel tasto di scelta rapida Cmd-? (Cmd-Shift-/ già si comporta come tale.Si muove chiave di messa a fuoco per il menu di aiuto al campo di ricerca, se non è già concentrato, altrimenti respinge il menu.
È necessario utilizzare l'attributo AXMenuItemMarkChar
.
Esempio:
tell application "System Events"
tell process "Cisco Jabber"
set X to (value of attribute "AXMenuItemMarkChar" of menu item "Available" of menu "Status" of menu item "Status" of menu "File" of menu bar item "File" of menu bar 1) is "✓" -- check if Status is "Availible"
end tell
end tell
Se la voce di menu è selezionata, il valore di ritorno è ✓
, altrimenti è missing value
.
Nota:Questo test funziona solo se l'applicazione di cui menu sono in ispezionato, è attualmente in primo piano.
Ho appena imbattuto il bisogno di fare da solo per alcuni l'elaborazione dei file in Illustrator.
Ecco cosa mi è venuto fuori:
tell application "Adobe Illustrator"
activate
tell application "System Events"
tell process "Illustrator"
set frontmost to true
set activeMenuItem to enabled of menu item "Unlock All" of menu "Object" of menu bar item "Object" of menu bar 1
if activeMenuItem is true then
tell me to beep 3
else
tell me to beep 2
end if
end tell
end tell
end tell
Fatto.
Questo ha funzionato senza alcun problema e può essere utilizzato per scorrere un file.Io probabilmente hanno a che fare più volte nel mio futuro di automazione.
Buona fortuna!