osx focus applescript menu

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 .