AppleScript: Jak otworzyć plik w TextEdit, bez wysuwania innych okien TextEdit na wierzch?

2

Mam następujący kod AppleScript, który otwiera określony plik w TextEdit w oknie z określonymi granicami:

set targetFilepath to "/Users/Me/Desktop/My Fruit Log.txt"
tell application "TextEdit"
    activate
    open targetFilepath
    set bounds of front window to {279, 111, 1180, 719}
end tell

Problem z tym kodem polega na tym, że jeśli mam otwarte inne pliki TextEdit, kod przeniesie również inne dokumenty na pierwszy plan. Chciałbym jednak, aby tylko ten jeden, konkretny plik tekstowy został przeniesiony na pierwszy plan.

Kod nie spowoduje przeniesienia zminimalizowanego okna TextEdit na przód, ale przeniesie wszystkie ukryte, niezminimalizowane okna TextEdit na przód.

Kiedy usuwam activatewiersz z kodu:

tell application "TextEdit"
    open targetFilepath
    set bounds of front window to {279, 111, 1180, 719}
end tell

plik jest otwarty, ale jego okno nie jest przenoszone na pierwszy plan.

OS X El Capitan, wersja 10.11.6.


Oto wizualna reprezentacja tego, co opisałem powyżej. Miałem zero okien zminimalizowane na moim komputerze, gdy te zrzuty ekranu zostały wykonane.

Tak wygląda mój ekran przed uruchomieniem AppleScript :

Przed

Tak chcę, aby mój ekran wyglądał po uruchomieniu AppleScript :

Po - Pożądany

Oto jak obecnie wygląda mój ekran po uruchomieniu AppleScript :

Po - Rzeczywiste


W celu pełnego ujawnienia mój kod przesuwa także położenie kursora TextEdit po otwarciu pliku. Nie wiem, czy wpłynęłoby to na potencjalne rozwiązanie, ale oto dodatkowy kod, który następuje po powyższym fragmencie ( xjest liczbą całkowitą, która jest wcześniej przypisywana):

tell application "TextEdit" to activate
    tell application "System Events" to tell process "TextEdit"
        repeat x times
            key code 125
        end repeat
    end tell
end tell
kula Rubika
źródło
Mój oryginalny post zawierał błąd. Zobacz poprawiony post. Żadne okna TextEdit nie są przekazywane bez activate, nawet okno pliku, który jest otwarty.
kula
Jakie jest twoje preferowane rozwiązanie tutaj? Czy chcesz, aby skrypt działał, a następnie ukrywał wszystkie inne okna TextEdit, czy też zamiast tego ma zminimalizować wszystkie inne okna TextEdit? Czy to nie ma znaczenia? Albo coś innego?
Monomeeth
@Monomeeth Nie zminimalizowane. Moim preferowanym rozwiązaniem jest to, że ten jeden plik pojawia się na pierwszym planie, a pozostałe okna TextEdit (które są obecnie w tle po uruchomieniu skryptu) pozostają tam, gdzie są w tle. Jeśli inne okna muszą zostać przeniesione na przód, to chciałbym, aby zostały wysłane w tle.
kula
Nie do końca rozumiem, o co tu chodzi - może potrzebuję kolejnej kawy! :) Proszę o wyrozumiałość, ale jeśli twój skrypt otwiera plik, który chcesz w TextEdit i aktywuje go, aby został przeniesiony na pierwszy plan, czy to nie oznacza, że ​​wszystkie inne okna TextEdit w tle ? A może chcesz zmienić sposób działania aplikacji w macOS (np. Po aktywacji Findera wszystkie okna Findera są widoczne, ale tylko jedno z nich jest na pierwszym planie, podobnie jak wszystkie inne aplikacje). Tak więc, chyba że chcesz, aby okna były zamknięte, zminimalizowane lub ukryte, będą one widoczne.
Monomeeth
@Monomeeth Być może nie używam poprawnej terminologii. Chcę, aby pozostałe okna były ukryte. Okna te mogą być technicznie „w tle”, gdy moja Usługa jest aktywowana, ale nie są już ukryte. Myślę, że używanie zrzutów ekranu jest najlepszym sposobem na pokazanie tego, co opisuję. Zobacz zrzuty ekranu dodane do mojego postu.
kula

Odpowiedzi:

2

Myślę, że masz problem z tym, że źle zrozumiałeś, co się właściwie dzieje. Pozwól mi spróbować wyjaśnić ...

Pierwsze pytanie, na które należy odpowiedzieć, to dlaczego okna nie były widoczne na pierwszym zrzucie ekranu? Oczywiście plik My Fruit Log.txt nie był widoczny, ponieważ nie był jeszcze otwarty (tzn. Skrypt jeszcze się nie uruchomił). Ale co z innymi oknami? Istnieją tylko trzy możliwości:

  1. TextEdit tak naprawdę nie działał (dlatego nie ma okien). To byłoby oczywiste - więc nie potrzeba więcej dyskusji.
  2. TextEdit działał, ale był ukryty (dlatego wszystkie okna są ukryte). Oznacza to po prostu, że ukryłeś TextEdit przed widokiem. Uruchomienie skryptu powoduje, że jest on ponownie widoczny (wraz ze wszystkimi jego oknami, z wyjątkiem tych, które można zminimalizować).
  3. TextEdit działał, ale wszystkie okna zostały zminimalizowane. Oznacza to po prostu, że TextEdit jest uruchomiony, ale żadne okna nie są widoczne, ponieważ zostały zminimalizowane. Uruchomienie skryptu powoduje, że sama aplikacja jest ponownie widoczna i na pierwszym planie, ale wszystkie zminimalizowane okna pozostają zminimalizowane.

W twoim scenariuszu jest prawie pewne, że zastosowanie ma Opcja 2. Tak więc, chociaż nie jest to, co chcesz usłyszeć, twój skrypt działa tak, jak powinien w macOS. Jedyny sposób mogę myśleć o chwili obecnej, aby osiągnąć to, co chcesz w sposób praktyczny, jest zapewnienie, że skrypt minimalizuje wszystkie inne okna, z wyjątkiem jednego, że właśnie otwarty. Na przykład można to osiągnąć za pomocą następującego kodu:

set targetFilepath to "/Users/Me/Desktop/My Fruit Log.txt"
tell application "TextEdit"
    activate
    open targetFilepath
    tell (windows whose id is not (get id of front window) and visible is true)
        set miniaturized to true
    end tell
    set bounds of front window to {279, 111, 1180, 719}
end tell

Jak widać, właśnie dodałem dwie linie kodu. Myślę, że są dość zrozumiałe - po prostu mówią TextEdit, aby zminimalizować każde okno, które spełnia te dwa warunki (1. nie jest to okno przednie i 2. jest widoczne).

Mam nadzieję, że to zadziała dla Ciebie - ale jeśli nie, może ktoś wymyśli lepsze rozwiązanie.

Monomeeth
źródło
„TextEdit działał, ale był ukryty (dlatego wszystkie okna są ukryte)”. Czy mówisz, że kliknąłem przycisk „Ukryj” wyświetlany po kliknięciu prawym przyciskiem myszy ikony TextEdit w Docku? Tak nie jest. Powodem, dla którego nie widać żadnych okien TextEdit na moim pierwszym zrzucie ekranu, jest to, że na wierzchu okien TextEdit została otwarta inna aplikacja (tj. Preview.app). Korzystam także z funkcji Mission Control, więc mogę mieć na przykład dwa okna TextEdit przed oknem innej aplikacji i dwa okna TextEdit ukryte za tym oknem.
kula
To nie jest dokładnie to, co mówię, ale przykład z Docka jest jednym ze sposobów, w jaki można go ukryć. Innym jest użycie opcji Ukryj inne z menu aplikacji innych aplikacji. I jeszcze jedno jest dokładnie tym, co właśnie opisałeś w swoim komentarzu - że zostało ukryte, ponieważ inne aplikacje i ich okna (Preview.app w twoim zrzucie ekranu) były na pierwszym planie. Niezależnie od tego, w jaki sposób TextEdit był niewidoczny, za każdym razem, gdy jest ponownie przenoszony na pierwszy plan, wszystkie jego okna stają się widoczne ( chyba że są zminimalizowane), i tak się dzieje po uruchomieniu skryptu.
Monomeeth
Zasadniczo to, co próbowałem zrobić z moją odpowiedzią, to wyjaśnienie, dlaczego twój skrypt spowodował zachowanie, którego doświadczasz i dlaczego tego można było oczekiwać. Mój niewielki dodatek do twojego kodu dotyczy tego faktu, ale oczywiście mogą istnieć lepsze sposoby robienia tego, co chcesz. Nie testowałem odpowiedzi przez @Mockman, ale może to być również dobre rozwiązanie. Powodem, dla którego zdecydowałem się na to, było to, że zauważyłem, że zadajesz wiele pytań na temat AppleScript i pomyślałem, że nieznaczna modyfikacja istniejącego kodu jest lepszym rozwiązaniem dla Ciebie. Ale tylko Ty możesz zdecydować, który z nich jest odpowiedni dla Ciebie.
Monomeeth
Rozumiem. Doceniam twoją odpowiedź. Po prostu powiedziałeś: „TextEdit był uruchomiony, ale był ukryty (dlatego wszystkie okna są ukryte)”. co mnie zdezorientowało.
kula
1

Co powiesz na to?

tell application "TextEdit"

    set fWin to front window -- Since you're already using 'front window'
    repeat with w in every window
        set visible of w to false
    end repeat

    -- set visible of window id 189 to true (frontmost on my mac now)
    set visible of fWin to true
    activate
end tell

Jestem pewien, że istnieją inne metody identyfikacji okien. Możesz także zrobić coś takiego… gdzie używana jest lista okien od drugiej do ostatniej.

tell application "TextEdit"
    -- Assuming that front window should be visible
    set winList to (windows 2 thru -1)
    repeat with w in winList
        set visible of w to false
    end repeat

    activate
end tell

Kluczowym terminem jest tutaj „widoczny”.

Mockman
źródło
Nie mogę uzyskać poprawnego działania żadnego z tych rozwiązań. Czy moja open targetFilepathlinia powinna znajdować się przed czy po twoim kodzie? Kładę ten wiersz przed twoim kodem. Nie zauważam żadnej różnicy w twoim pierwszym rozwiązaniu; ukryte okna TextEdit nadal stają się widoczne. Drugie rozwiązanie całkowicie zamyka ukryte okna, zamiast po prostu je ukryć.
kula
Ciekawy. Jeśli chodzi o drugi skrypt, nie jest zamknięty. Ale to jest naprawdę niewidoczne. Jeśli otworzysz skrypt i uruchomisz polecenia, takie jak „widoczny identyfikator okna xxx” lub „identyfikator trzeciego okna” itp., Wtedy uzyskasz inne wyniki niż w przypadku „zamkniętego” okna. W ten sposób słownik definiuje właściwość okna…visible (boolean) : Whether the window is currently visible.
Mockman
Odnośnie pierwszego skryptu… tak. Zacząłem od momentu, w którym wszystkie twoje dokumenty były już otwarte.
Mockman,
Jeśli chodzi o twój pierwszy komentarz, w jaki sposób mogę sprawić, aby te niewidoczne okna były wtedy ukryte (bez użycia do tego AppleScript)? Jeśli zminimalizuję wszystkie okna wszystkich aplikacji, te niewidoczne okna nadal się nie pojawiają. Kliknięcie prawym przyciskiem myszy ikony TextEdit w Docku i wybranie „Pokaż wszystkie okna” również nie spowoduje przejścia do niewidocznych okien.
kula
Może być tak, że nie możesz (bez Applecript). Wydaje się to trochę dziwne.
Mockman,