osx - En Applescript, ¿cómo puedo saber si un elemento del menú está seleccionado/enfocado?
focus menu (4)
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. Por lo tanto, quiero detectar si el cuadro de búsqueda ya está enfocado para escribir, y si es así, escriba 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 obtengo este error:
No se puede enfocar {elemento de menú 1 del menú "Ayuda" de la barra de menú elemento "Ayuda" de la barra de menú 1 del proceso de aplicación "Editor de secuencias de comandos" de la aplicación "Eventos del sistema"}.
Entonces, ¿hay alguna manera de que mi script pueda detectar si el cuadro de búsqueda ya está enfocado?
Resolví mi problema al solucionarlo. Todavía no sé cómo verificar si un elemento de menú está seleccionado, así que dejaré este tema abierto.
Usando / Desarrollador / Aplicaciones / Utilidades / Herramientas de accesibilidad / Accessibility Inspector.app puede usar el sistema de accesibilidad incorporado para observar las propiedades del elemento de la interfaz de usuario bajo el mouse. Tome nota especial de la acción cmd-F7 para bloquear el enfoque 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 los eventos del sistema o, por lo general, adivinar la terminología correcta.
Usando esto puedes determinar dos cosas. Primero, la propiedad focused
no está en el menu item
del menu item
, sino que hay un text field
dentro del menu item
del menu item
que está enfocado. En segundo lugar, el elemento del menú tiene una propiedad selected
.
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 El evento clave no está disparando por lo que puedo decir, por lo que es posible que algo siga siendo raro con la propiedad focused
en el campo de texto.
De todos modos, su click
nuevo solución parece mucho más fácil.
Me acabo de dar cuenta de la necesidad de hacerlo yo mismo para el procesamiento de archivos en Illustrator.
Aquí 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!
El acceso directo clave 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 de lo contrario descarta el menú.
AXMenuItemMarkChar
usar el 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 un missing value
.
Nota: Esta prueba solo funciona si la aplicación cuyos menús están siendo inspeccionados está actualmente en primer plano .