es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Recopilando atajos de teclado para los elementos de menú de otra aplicación.

Estoy escribiendo una aplicación que permite acceder a los elementos del menú de otras aplicaciones a través del marco de accesibilidad. No tengo problemas para obtener la lista de menús, sus elementos de menú, etc.

Sin embargo, hasta donde puedo ver, el marco de accesibilidad no brinda acceso a los atajos de teclado para cada elemento.

Más concretamente, si mi aplicación muestra el elemento de menú “Archivo” -> “Nueva ventana del Finder” del “Finder”, me gustaría anotarlo en la pantalla con “Comando-N”, para que el usuario pueda aprender los atajos de memoria.

Por el momento, no veo ninguna forma de obtener esa información. Si no es a través del marco de accesibilidad “AXUIElement”, ¿cómo se puede obtener esa información?

Cualquier ayuda sería muy apreciada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para obtener atajos de teclado de elementos de menú a través del marco de accesibilidad

    Como ha señalado el OP, el marco de accesibilidad no proporciona una forma directa de acceder a los atajos de teclado de los elementos de menú. Sin embargo, esta información se puede obtener de forma indirecta combinando la información obtenida a través del marco de accesibilidad con la información obtenida de otras fuentes.

    Una forma de obtener los atajos de teclado para un elemento de menú en particular es utilizar la clase NSMenuItem proporcionada por macOS. Esta clase tiene una propiedad llamada keyEquivalent, que devuelve el atajo de teclado asociado con el elemento de menú.

    Para obtener un objeto NSMenuItem para un elemento de menú en particular, puedes utilizar la clase AXUIElement proporcionada por el marco de accesibilidad para obtener el elemento de la interfaz de usuario para el elemento de menú. Una vez que tienes el elemento de la interfaz de usuario, puedes utilizar el método performAction para simular un clic en el elemento. Esto hará que se muestre el menú, con el elemento seleccionado resaltado. Luego puedes utilizar la clase NSMenu proporcionada por macOS para obtener el objeto NSMenuItem correspondiente al elemento seleccionado y recuperar su atajo de teclado.

    Aquí tienes un código de ejemplo que muestra cómo se puede hacer esto:

    import Cocoa
    
    // Obtén el elemento de la interfaz de usuario para el elemento de menú "Nueva ventana del Finder" del Buscador
    let app = NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.finder").first!
    let menuVentana = app.menu!.item(withTitle: "Archivo")!.submenu!.item(withTitle: "Nueva ventana del Finder")!
    let axMenuItem = menuVentana.axuiElement
    
    // Simula un clic en el elemento de menú
    AXUIElementPerformAction(axMenuItem, kAXPressAction as CFString)
    
    // Obtén el objeto NSMenuItem para el elemento seleccionado
    let menúEmergente = menuVentana.submenu!
    let elementoSeleccionado = menúEmergente.highlightedItem!
    let nsMenuItem = menúEmergente.item(withTitle: elementoSeleccionado.title)!
    
    // Obtén el atajo de teclado para el elemento de menú
    let atajo = nsMenuItem.keyEquivalent
    print(atajo)
    

    Este código debería mostrar n, que es el atajo de teclado para el elemento de menú “Nueva ventana del Finder”.

    Ten en cuenta que este enfoque puede no funcionar para todos los elementos de menú, especialmente si están anidados en una jerarquía de menús. En tales casos, es posible que necesites utilizar un enfoque recursivo para navegar por la jerarquía de menús y localizar el elemento deseado.

Comments are closed.