In Applescript, wie kann ich, wenn ein Menüpunkt herauszufinden, ausgewählt / fokussiert?
-
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.
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!