2008-09-16 28 views
5

Ich habe ein Skript für OS X 10.5, das das Suchfeld im Hilfe-Menü jeder Anwendung fokussiert. Ich habe es auf einer Tastenkombination und, ähnlich wie Spotlight, möchte ich es wechseln, wenn ich das Skript ausführen. Ich möchte also feststellen, ob das Suchfeld bereits für die Eingabe fokussiert ist, und wenn dies der Fall ist, geben Sie Esc ein, anstatt auf das Menü Hilfe zu klicken. HierIn Applescript, wie kann ich herausfinden, ob ein Menüpunkt ausgewählt/fokussiert ist?

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 dieses:

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:

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"}.

So gibt es einen Weg, ich kann mein Skript erkennen, ob das Suchfeld bereits fokussiert ist?


Ich löste mein Problem von working around it. Ich weiß immer noch nicht, wie man überprüft, ob ein Menüelement ausgewählt ist, also lasse ich dieses Thema offen.

Antwort

2

Verwenden/Entwickler/Anwendungen/Dienstprogramme/Eingabehilfen/Eingabehilfen Inspector.app Mit dem integrierten Eingabehilfen-System können Sie die Eigenschaften des Benutzeroberflächenelements unter der Maus anzeigen. Beachten Sie besonders die Aktion cmd-F7, um den Fokus auf ein Element und die Schaltfläche Aktualisieren zu fixieren. Leider stimmen die Element- und Eigenschaftsnamen nicht direkt mit denen in der Skriptsuite überein, aber Sie können das Wörterbuch nach Systemereignissen durchsuchen oder die richtige Terminologie erraten.

Mit diesem können Sie zwei Dinge bestimmen. Erstens, die focused Eigenschaft ist nicht auf die menu item, sondern es gibt eine text field innerhalb der menu item, die konzentriert ist. Zweitens hat der Menüpunkt 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 schießt nicht so weit, wie ich sagen kann, also kann etwas noch mit der focused Eigenschaft auf dem Textfeld hinky sein.

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

+0

'Wenn searchField's konzentriert wahr ist dann .. .. ist das wirklich Apple Script Syntax? ein Apostroph hinzufügen? – abbood

4

Die Cmd- in Tastenkombination gebaut? (Cmd-Shift-/) verhält sich bereits so. Es verschiebt den Hauptfokus auf das Suchfeld des Hilfemenüs, wenn es nicht bereits fokussiert ist, und gibt ansonsten das Menü frei.

1

Ich bin gerade auf die Notwendigkeit gekommen, dies selbst für eine Dateiverarbeitung in Illustrator zu tun.

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 

Erledigt.

Dies funktionierte ohne Probleme und konnte verwendet werden, um eine Datei zu iterieren. Ich werde das wahrscheinlich noch viel öfter in meiner zukünftigen Automatisierung machen müssen.

Viel Glück!

2

Sie müssen das 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.

Hinweis: Dieser Test funktioniert nur, wenn die Anwendung, deren Menüs gerade überprüft werden, derzeit am weitesten vorne liegt.