Dans Applescript, comment puis-je savoir si un élément de menu est sélectionné / ciblé?
-
09-06-2019 - |
Question
J'ai un script pour OS X 10.5 qui concentre la zone de recherche dans le menu Aide de toute application. Je l’ai sur une combinaison de touches et, tout comme Spotlight, je souhaite qu’elle bascule lorsque je lance le script. Je souhaite donc détecter si le champ de recherche est déjà activé pour la saisie et, le cas échéant, tapez Echap au lieu de cliquer sur le menu Aide.
Voici le script tel qu'il se présente maintenant:
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
Et je pense à quelque chose comme ça:
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
... mais j'obtiens cette erreur:
Impossible de se concentrer sur {l'élément de menu 1 du menu " Aide " de l'élément de la barre de menu " Aide " de la barre de menus 1 du processus d’application "Script Editor" d'application "Événements système"}.
Y a-t-il moyen de faire en sorte que mon script détecte si le champ de recherche est déjà activé?
J'ai résolu mon problème en solution au problème . Je ne sais toujours pas comment vérifier si un élément de menu est sélectionné, je vais donc laisser ce sujet ouvert.
La solution
À l'aide de / Developer / Applications / Utilitaires / Outils d'accessibilité / Accessibility Inspector.app, vous pouvez utiliser le système d'accessibilité intégré pour consulter les propriétés de l'élément d'interface utilisateur situé sous la souris. Prenez note de l'action cmd-F7 pour verrouiller la mise au point sur un élément et sur le bouton Actualiser. Malheureusement, les noms des éléments et des propriétés ne correspondent pas directement à ceux de la suite de scripts, mais vous pouvez consulter le dictionnaire des événements système ou deviner la bonne terminologie.
En utilisant cela, vous pouvez déterminer deux choses. Tout d'abord, la propriété
ne se trouve pas sur l'élément de menu
, mais il existe plutôt un champ de texte
dans l'élément de menu
qui est ciblé. Deuxièmement, l'élément de menu a une propriété selected
.
Avec cela, je suis venu avec:
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
Bien que cela ne fonctionne toujours pas. L'événement clé ne se déclenche pas autant que je peux en juger. Il se peut donc que quelque chose ne soit toujours pas génial avec la propriété
située dans le champ de texte.
Quoi qu’il en soit, votre solution cliquez sur
semble beaucoup plus simple.
Autres conseils
Le raccourci clavier intégré Cmd -? ( Cmd-Shift - / ) se comporte déjà de cette manière. Il déplace le focus clé vers le champ de recherche du menu d'aide s'il n'est pas déjà ciblé, sinon il ferme le menu.
Vous devez utiliser l'attribut AXMenuItemMarkChar
.
Exemple:
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
Si l'option de menu est cochée, la valeur renvoyée est ?
, sinon il s'agit de valeur manquante
.
Remarque: ce test ne fonctionne que si l'application dont les menus sont inspectés est actuellement au premier plan .
Je viens de rencontrer le besoin de le faire moi-même pour certains traitements de fichiers dans Illustrator.
Voici ce que j'ai créé:
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
Terminé.
Cela fonctionnait sans problème et pouvait être utilisé pour itérer un fichier. Je devrai probablement le faire plusieurs fois dans ma future automatisation.
Bonne chance!