In Applescript, wie kann ich, wenn ein Menüpunkt herauszufinden, ausgewählt / fokussiert?

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe ein Skript für OS X 10.5, die das Suchfeld im Hilfe-Menü von jeder Anwendung konzentriert. Ich habe es auf einer Tastenkombination und, ähnlich wie Spotlight, ich will es wechseln, wenn ich das Skript ausführen. Also, ich möchte, wenn das Suchfeld erkennen bereits zur Typisierung fokussiert ist, und wenn ja, geben Sie Esc stattdessen das Hilfe-Menü zu klicken.

Hier ist das Skript, wie es jetzt steht:

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

Und ich denke an so etwas wie folgt aus:

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

... aber ich bekomme diese Fehlermeldung:

  

Kann nicht erwarten Aufmerksamkeit von {Menüpunkt 1 des Menü „Hilfe“ der Menüleiste „Hilfe“ der Menüleiste 1 Anwendungsprozess „Skript-Editor“ der Anwendung „Systemereignisse“}.

So ist es eine Möglichkeit, ich meinen Skript bekommen zu erkennen, ob das Suchfeld fokussiert ist schon?


löste ich mein Problem von um daran zu arbeiten . Ich weiß noch nicht, wie Sie überprüfen, ob ein Menüpunkt ausgewählt wird, obwohl, so dass ich dieses Thema offen lassen.

War es hilfreich?

Lösung

Mit / Developer / Applications / Utilities / Accessibility Tools / Zugänglichkeit Inspector.app Sie die Integrierte Zugangssystem verwenden können, um Eigenschaften des Oberflächenelements unter der Maus zu suchen. Beachten Sie besonders die cmd-F7 Aktion Fokus auf ein Element und die Refresh-Taste zu sperren. Leider ist die Elemente und Eigenschaftsnamen nicht direkt die in der Skript-Suite passen, aber Sie im Wörterbuch für Systemereignisse aussehen können oder in der Regel erraten die richtige Terminologie.

Mit diesem können Sie zwei Dinge bestimmen. Erstens ist die focused Eigenschaft nicht auf dem menu item, sondern es ist ein text field im menu item, die fokussiert ist. Zweitens wird der Menüpunkt hat eine selected Eigenschaft.

Damit kam ich mit:

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

Obwohl dies immer noch nicht funktioniert. Das Schlüsselereignis ist nicht so weit wie ich kann sagen, Brennen, so etwas kann immer noch mit der focused Eigenschaft auf dem Textfeld hinky sein.

Wie auch immer, Ihre click wieder Lösung scheint viel einfacher.

Andere Tipps

Die in Tastenkombination gebaut Cmd -? ( Cmd-Shift-- / ) verhält sich schon so. Es bewegt Schwerpunkt auf das Suchfeld Hilfe-Menüs, wenn es nicht bereits fokussiert ist, und sonst entlässt das Menü.

Sie müssen Attribut AXMenuItemMarkChar verwenden.

Beispiel:

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

Wenn der Menüpunkt aktiviert ist, ist der Rückgabewert , sonst ist es missing value ist.

. Hinweis: Dieser Test funktioniert nur, wenn die Anwendung, deren Menüs kontrolliert werden, ist zur Zeit vorderste

Ich kam gerade über die Notwendigkeit, dies zu tun, um mich für einige Dateiverarbeitung in Illustrator.

Hier ist, was ich kam mit:

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

Fertig.

Das funktionierte ohne Probleme und könnte verwendet werden, um eine Datei iterieren. Ich werde wahrscheinlich so viele Male in meiner zukünftigen Automatisierung zu tun haben.

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top