En Applescript, ¿cómo puedo saber si un elemento del menú está seleccionado/enfocado?

StackOverflow https://stackoverflow.com/questions/69030

  •  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.

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top