Wie überarbeite ich einen "Systemereignisse"-Befehl in AppleScript, damit er automatisch in allen Anwendungen funktioniert?

Mit dem folgenden AppleScript-Code innerhalb einer Aktion „AppleScript ausführen“ in einem Dienst:

tell application "System Events"
    set theSBounds to {{572, 64}, {332, 515}}
    set position of window "Google Hangouts - myemailaddress@gmail.com" of application process "Google Chrome" to item 1 of theSBounds
    set size of window "Google Hangouts - myemailaddress@gmail.com" of application process "Google Chrome" to item 2 of theSBounds
end tell

Der Dienst funktioniert nur, wenn die Anwendung, von der dieser Dienst aufgerufen wurde, zur Liste der Anwendungen unter „Zulassen, dass die folgenden Apps Ihren Computer steuern“ hinzugefügt wurde. Diese Liste finden Sie unter Systemeinstellungen → Sicherheit & Datenschutz → Eingabehilfen.

Ist es möglich, den AppleScript-Code irgendwie zu ändern, sodass nicht jede Anwendung auf dem eigenen Computer zur Liste hinzugefügt werden muss? Oder muss man statt jeder Anwendung auf dem eigenen Rechner nur noch einen Eintrag in die Liste aufnehmen?

Ich dachte, dass so etwas funktionieren könnte:

do shell script "osascript -e 'tell application \"System Events\"' -e 'set theSBounds to {{572, 64}, {332, 515}}' -e 'set position of window \"Google Hangouts - myemailaddress@gmail.com\" of application process \"Google Chrome\" to item 1 of theSBounds' -e 'set size of window \"Google Hangouts - myemailaddress@gmail.com\" of application process \"Google Chrome\" to item 2 of theSBounds' -e 'end tell'" with administrator privileges

Dieser Code erfordert jedoch auch, dass die Anwendung, von der aus der Dienst ausgeführt wird, der Barrierefreiheitsliste hinzugefügt wird.

Hinweis: Ich möchte dieses AppleScript nur als Dienst ausführen und nicht in einer von Automator erstellten Anwendung, da der Code ausgewählten Text als Eingabe erhält (systemweit).

Sind Sie fest entschlossen, dieses Skript als Dienst zu verwenden? Warum speichern Sie das Skript nicht einfach als Anwendung über den Skripteditor? Dann müssen Sie nur diese eine App hinzufügen, um den Zugriff in den Systemeinstellungen zu ermöglichen. Dann können Sie noch einen Schritt weiter gehen und die App sprechbar machen und sie jederzeit mit einem Diktierbefehl starten.
Danke für den Vorschlag. Ich wollte nicht den vollständigen Code posten, da er sich nicht auf meine Frage bezieht, aber darin würden Sie sehen, dass der Code den aktuell hervorgehobenen Text als Eingabe akzeptiert. Ohne den ausgewählten Text zuerst in die Zwischenablage zu kopieren, kann ein AppleScript als Anwendungsdatei nicht auf die Auswahl zugreifen. Außerdem ist mir kein Drittanbieterprogramm bekannt, das den ausgewählten Text abrufen und als Variable an ein AppleScript senden kann.
Zum zweiten Punkt, ich war einmal ein (kurzer) Benutzer der Diktierbefehlsfunktion von Mac. Aber ich stellte schließlich fest, dass es nicht zuverlässig genug war, um es zu verwenden. Wenn mein Sprechen das Diktat auch nur in 10 % der Fälle nicht auslöst, ist es (meiner Meinung nach) einfach einfacher, die Anwendung über die Menüleiste oder eine Tastenkombination zu starten, als sich darauf zu verlassen, dass mein Diktat richtig gehört wird.
Das ist einer der Nachteile der Automatisierung, da man für jede App, die den Computer durch einen Automatisierungsprozess steuert, eine Erlaubnis erteilen muss. Sie müssen also nach Bedarf Apps hinzufügen. Ich bin sicher, das ist nicht die Antwort, die Sie hören wollten, aber beantwortet das die Frage, die Sie gestellt haben, oder verstehe ich nicht, was Sie fragen?
@ user3439894 Ich denke, Sie verstehen richtig. Hier ist eine andere Möglichkeit, meine Frage zu stellen: Gibt es einen Ersatz für "Systemereignisse", mit dem ich denselben Effekt erzielen kann? Das Problem mit „System Events“ in AppleScript ist, dass es tatsächlich jede App verwendet, die man gerade geöffnet hat, um den Befehl auszuführen, im Gegensatz zur Verwendung der App „System Events“ zum Ausführen des Befehls (zu finden unter /System/Library/CoreServices/ Systemereignisse.app).
@rubiks Sphäre, Das Problem ist, dass Systemereignisse nicht der Anrufprozess sind, die am sichtbarsten sichtbare App ist diejenige, die den Anruf tätigt und als solche eine Erlaubnis benötigt. Ich kenne keine Möglichkeit, das zu ändern. Das heißt aber nicht, dass es keinen gibt, ich weiß es nur nicht, aber meine Erfahrung sagt mir, dass es wahrscheinlich keinen einfachen Weg gibt, selbst wenn es einen Weg gäbe. Weil Sie die Sicherheitsmaßnahmen umgehen müssten, die Apple absichtlich implementiert hat. Apple wird nicht offen veröffentlichen, wie man es umgehen kann. Als Benutzer treffen Sie also die Wahl, ob Sie die Automatisierung und die damit verbundenen Sicherheitsrisiken verwenden oder nicht.
@user3439894 Interessant. Gibt es eine Möglichkeit, die sichtbarste App vor die tell application "System Events"Zeile zu setzen, damit ich die App auswählen kann, die den von Systems Events verwendeten Aufruf ausführt?
@rubik's Sphäre, aus dem Kopf würde ich nein sagen, weil Sie Systemereignisse benötigen, um den Namen des ersten Anwendungsprozesses zu erhalten, dessen vorderste wahr ist.
@ user3439894 Ich habe eine verwandte Frage. Warum tell application "System Events" to set frontmost of process "TextEdit" to truemuss man für einige Systemereignisse-Befehle (z. B.: ) keinen Zugriff auf die sichtbarste Anwendung gewähren, damit der Systemereignis-Befehl funktioniert, aber für andere Systemereignis-Befehle (wie den in my Frage), muss man Zugriff gewähren?

Antworten (1)

Ich habe eine gute Lösung (dh Workaround) gefunden.

Fügen Sie den Codeblock „Systemereignisse“ in eine Aktion „AppleScript ausführen“ ein und speichern Sie ihn als eigene Anwendungsdatei in Automator. Hinweis: Die Dateierweiterung dieses Codes muss .app sein, damit dies funktioniert (mehr dazu gleich).

Gehen Sie zu Systemeinstellungen → Sicherheit & Datenschutz → Registerkarte Datenschutz → Eingabehilfen. Fügen Sie die neu erstellte Anwendung zur Liste der Apps hinzu, die Ihren Computer steuern dürfen, und markieren Sie sie.

Führen Sie die neu erstellte App in Ihrem Dienst aus. Dazu können Sie Ihrem AppleScript-Code die folgende Zeile hinzufügen:

do shell script "osascript -e 'tell application \"Application Name\" to activate'"

(Ich verwende normalerweise osascriptto- activateAnwendungen, wenn ich eine Aktion „AppleScript ausführen“ in einem Dienst verwende, da dies einen von mir entdeckten Fehler bei Diensten umgeht .)

Ihr Dienst sollte jetzt in jeder Anwendung auf Ihrem Computer einwandfrei laufen, obwohl nur einer Anwendung (diejenige, die den „Systemereignisse“-Code enthält) ausdrücklich die Befugnis erteilt wurde, den Computer zu steuern.

Die Datei muss als .app-Datei und nicht als .scpt- oder .applescript-Datei gespeichert werden. Dies liegt daran, dass es nicht möglich ist, .scpt- oder .applescript-Dateien zur Liste der Apps hinzuzufügen, die Ihren Computer steuern dürfen. Im Dialog können nur echte .app-Dateien ausgewählt werden.

Beachten Sie, dass die .app-Datei nicht in Automator erstellt werden muss. Wenn Sie die .app-Datei in Script Editor.app erstellen und die anderen Schritte befolgen, funktioniert die .app-Datei auf die gleiche Weise.

Es gibt jedoch einen Unterschied. Wenn die .app-Datei in Automator erstellt wird, kann man entweder activateoder verwenden launch, um die Anwendung in ihrem Dienst auszuführen. Aber wenn die .app-Datei im Skripteditor erstellt wird, kann man sie nur activatezum Ausführen der Anwendung verwenden; launchwird dazu führen, dass nichts passiert.

Vergessen Sie nicht, dies als akzeptierte Antwort zu markieren! :) +1 für eine nette Problemumgehung!
Vielen Dank, ich habe einen anderen Fehler erhalten, wenn ich versucht habe, einen Workflow zu aktivieren, aber Ihre Umgehung scheint immer noch zu funktionieren.