Jak przerobić polecenie „Zdarzenia systemowe” w AppleScript, aby automatycznie działało we wszystkich aplikacjach?

4

Z następującym kodem AppleScript w ramach akcji „Uruchom AppleScript” w usłudze:

tell application "System Events"
    set theSBounds to {{572, 64}, {332, 515}}
    set position of window "Google Hangouts - [email protected]" of application process "Google Chrome" to item 1 of theSBounds
    set size of window "Google Hangouts - [email protected]" of application process "Google Chrome" to item 2 of theSBounds
end tell

Usługa będzie działać tylko wtedy, gdy aplikacja, z której została wywołana, została dodana do listy aplikacji w „Zezwól aplikacjom poniżej na kontrolowanie twojego komputera”. Ta lista znajduje się w Preferencjach systemowych → Bezpieczeństwo i prywatność → Dostępność.

Czy można w jakiś sposób zmodyfikować kod AppleScript, aby dodawanie każdej aplikacji na komputerze do listy nie było konieczne? A może wystarczy dodać jeden element do listy, w przeciwieństwie do każdej aplikacji na komputerze?

Myślałem, że coś takiego może działać:

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

ale ten kod wymaga również, aby aplikacja, z której uruchomiono usługę, została dodana do listy ułatwień dostępu.

Uwaga: Chcę uruchamiać ten AppleScript tylko jako usługę, a nie w aplikacji utworzonej przez Automatora, ponieważ kod odbiera zaznaczony tekst jako jego dane wejściowe (ogólnosystemowe).

kula Rubika
źródło
Czy nie chcesz już używać tego skryptu jako usługi? Dlaczego nie zapisać skryptu jako aplikacji za pomocą edytora skryptów? Następnie musisz tylko dodać tę jedną aplikację, aby umożliwić dostęp w preferencjach systemowych. Następnie możesz pójść o krok dalej i sprawić, że aplikacja będzie mówiona, i uruchom ją w dowolnym momencie za pomocą polecenia dyktowania.
wch1zpink
Dzieki za sugestie. Nie chciałem publikować pełnego kodu, ponieważ nie jest on związany z moim pytaniem, ale w nim zobaczysz, że kod akceptuje podświetlony tekst jako swój wkład. Po pierwszym skopiowaniu zaznaczonego tekstu do schowka, AppleScript jako plik aplikacji nie może uzyskać dostępu do zaznaczenia. Ponadto nie znam nawet jednego programu innej firmy, który może pobrać zaznaczony tekst i wysłać go jako zmienną do AppleScript.
kula
W drugim punkcie byłem kiedyś (krótkim) użytkownikiem funkcji Mac Dictation Commands. Ale w końcu odkryłem, że nie był wystarczająco niezawodny w użyciu. Jeśli moje mówienie nie uruchomi dyktowania nawet w 10% przypadków, po prostu łatwiej jest (IMO) uruchomić aplikację z paska menu lub skrótu klawiaturowego, niż polegać na tym, że moje dyktando jest słyszalne poprawnie.
kula
Jest to jedna z wad automatyzacji polegająca na tym, że należy zezwolić na każdą aplikację sterującą komputerem za pomocą procesu automatyzacji. W razie potrzeby będziesz musiał dodać aplikacje. Jestem pewien, że nie jest to odpowiedź, którą chciałeś usłyszeć, ale czy to odpowiada na zadane pytanie, czy też nie rozumiem, o co pytasz?
user3439894
@ user3439894 Myślę, że rozumiesz poprawnie. Oto inny sposób, w jaki mogę zadać pytanie: Czy istnieje „zamiennik dla„ zdarzeń systemowych ”, których mogę użyć do osiągnięcia tego samego efektu? Problem z „Zdarzeniami systemowymi” w AppleScript polega na tym, że faktycznie używa dowolnej aplikacji, która jest aktualnie otwarta, aby wykonać polecenie, w przeciwieństwie do korzystania z aplikacji „Zdarzenia systemowe” do wykonania polecenia (znajduje się w / System / Library / CoreServices / System Events.app).
kula

Odpowiedzi:

2

Znalazłem dobre rozwiązanie (tj. Obejście).

Wstaw blok kodu „Zdarzenia systemowe” do akcji „Uruchom AppleScript” i zapisz go jako własny plik aplikacji w Automatorze. Uwaga: rozszerzenie pliku tego kodu musi mieć rozszerzenie .app, aby działało (więcej o tym za chwilę).

Przejdź do Preferencji systemowych → Bezpieczeństwo i prywatność → karta Prywatność → Dostępność. Dodaj i zaznacz nowo utworzoną aplikację do listy aplikacji, które mogą kontrolować Twój komputer.

Uruchom nowo utworzoną aplikację z poziomu swojej usługi. Aby to zrobić, możesz dodać następujący wiersz do kodu AppleScript:

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

(I zwykle wykorzystywać osascriptdo activatezastosowań przy użyciu „Uruchom AppleScript” działania w serwisie, ponieważ omija się błąd z usług, które odkryłem .)

Twoja usługa powinna teraz działać idealnie w każdej aplikacji na twoim komputerze, pomimo faktu, że tylko jedna aplikacja (ta, która zawiera kod „zdarzeń systemowych”) została wyraźnie upoważniona do sterowania komputerem.

Plik musi zostać zapisany jako plik .app, a nie jako plik .scpt lub .applescript. Wynika to z faktu, że nie można dodawać plików .scpt ani .applescript do listy aplikacji, które mogą kontrolować komputer; w oknie dialogowym można wybrać tylko prawdziwe pliki .app.

Pamiętaj, że pliku .app nie trzeba tworzyć w Automatorze. Jeśli utworzysz plik .app w Script Editor.app i wykonasz pozostałe kroki, plik .app będzie działał w ten sam sposób.

Jest jednak jedna różnica. Po utworzeniu pliku .app w Automatorze można użyć jednego z nich activatelub launchuruchomić aplikację w ich usłudze. Ale gdy plik .app zostanie utworzony w edytorze skryptów, można go użyć tylko activatedo uruchomienia aplikacji; launchspowoduje, że nic się nie wydarzy.

kula Rubika
źródło
1
Nie zapomnij zaznaczyć tego jako zaakceptowanej odpowiedzi! :) +1 za miłe obejście!
user3439894
Dziękuję, wystąpił inny błąd, gdy próbowałem aktywować przepływ pracy, ale Twoja praca nadal wydaje się działać.
The Matt