2008-09-16 8 views
5

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.En Applescript, ¿cómo puedo averiguar si un elemento de menú está seleccionado/enfocado?

Aquí está la secuencia de comandos 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:

Can’t get focused of {menu item 1 of menu "Help" of menu bar item "Help" of menu bar 1 of application process "Script Editor" of application "System Events"}.

Entonces, ¿hay alguna manera de que mi script pueda detectar si el cuadro de búsqueda ya está enfocado?


he resuelto mi problema por working around it. Todavía no sé cómo verificar si un elemento de menú está seleccionado, así que dejaré este tema abierto.

Respuesta

2

Uso/Developer/Aplicaciones/Utilidades/Herramientas de Accesibilidad/Accesibilidad Inspector.app se puede utilizar el sistema integrado de accesibilidad a ver las propiedades del elemento de interfaz de usuario bajo el ratón. 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 puede determinar dos cosas. Primero, la propiedad focused no está en el menu item, sino que hay un text field dentro del menu item que está enfocado. En segundo lugar, el elemento de 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. Por lo que yo sé, el evento clave no está disparando, por lo que es posible que algo siga siendo raro con la propiedad focused en el campo de texto.

De todos modos, su nuevo click solución parece mucho más fácil.

+0

'if searchField's focused is true then' .. ¿es realmente la sintaxis del script de apple? agregando un apóstrofo? – abbood

4

el construido en la tecla de acceso directo Cmd-? (Cmd-Shift-/) ya se comporta de esta manera. Mueve el foco principal al campo de búsqueda del menú de ayuda si aún no está enfocado, y de lo contrario descarta el menú.

1

Acabo de enterarme de la necesidad de hacerlo yo mismo para procesar algunos archivos en Illustrator.

Esto es lo que 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 

Done.

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!

2

Debe utilizar 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 se marca la opción de menú, el valor de retorno es , de lo contrario es missing value.

Nota: Esta prueba solo funciona si la aplicación cuyos menús están siendo inspeccionados actualmente es frontal.

Cuestiones relacionadas