En Applescript, ¿cómo puedo saber si un elemento del menú está seleccionado/enfocado?
-
09-06-2019 - |
Pregunta
Tengo un script para OS X 10.5 que enfoca el cuadro de búsqueda en el menú Ayuda de cualquier aplicación.Lo tengo en una combinación de teclas y, al igual que Spotlight, quiero que se alterne cuando ejecuto el script.Entonces, quiero detectar si el cuadro de búsqueda ya está enfocado para escribir y, de ser así, escribir Esc en lugar de hacer clic en el menú Ayuda.
Aquí está el guión tal como está ahora:
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
Y estoy pensando en algo como esto:
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
...pero me sale este error:
No puedo concentrarme en el {elemento de menú 1 del menú "Ayuda" del elemento de la barra de menú "Ayuda" de la barra de menú 1 del proceso de aplicación "Editor de scripts" de la aplicación "Eventos del sistema"}.
Entonces, ¿hay alguna manera de hacer que mi secuencia de comandos detecte si el cuadro de búsqueda ya está enfocado?
Resolví mi problema por trabajando alrededor de ello.Todavía no sé cómo comprobar si un elemento del menú está seleccionado, así que dejaré este tema abierto.
Solución
Usando /Developer/Applications/Utilities/Accessibility Tools/Accessibility Inspector.app puede usar el sistema de accesibilidad incorporado para ver las propiedades del elemento de la interfaz de usuario debajo del mouse.Tome nota especial de la acción cmd-F7 para bloquear el foco en un elemento y el botón Actualizar.Lamentablemente, los nombres de elementos y propiedades no coinciden directamente con los del conjunto de scripts, pero puede consultar el diccionario de eventos del sistema o, por lo general, adivinar la terminología correcta.
Usando esto puedes determinar dos cosas.Primero el focused
la propiedad no está en el menu item
, sino que más bien hay un text field
dentro de menu item
eso está enfocado.En segundo lugar, el elemento del menú tiene un selected
propiedad.
Con esto, se me ocurrió:
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
Aunque esto todavía no funciona.Hasta donde yo sé, el evento clave no es el disparo, por lo que aún puede haber algo complicado con el focused
propiedad en el campo de texto.
De todos modos, tu click
Nuevamente la solución parece mucho más fácil.
Otros consejos
El atajo de teclado integrado ¿Cmd-? (Cmd-Shift-/) ya se comporta así.Mueve el foco clave al campo de búsqueda del menú de ayuda si aún no está enfocado y, en caso contrario, descarta el menú.
Necesitas usar atributo AXMenuItemMarkChar
.
Ejemplo:
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 el elemento del menú está marcado, el valor de retorno es ✓
, de lo contrario es missing value
.
Nota:Esta prueba sólo funciona si la aplicación cuyos menús se están inspeccionando está actualmente primero.
Me encontré con la necesidad de hacer esto yo mismo para procesar algunos archivos en Illustrator.
Esto es lo que se me ocurrió:
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
Hecho.
Esto funcionó sin problemas y podría usarse para iterar un archivo.Probablemente tendré que hacer esto muchas más veces en mi futura automatización.
¡Buena suerte!