AppleScript'te senaryoyu odak dışı yapmak nasıl?


4

Tek bir oluşan Otomator Servis "AppleScript Çalıştır" aksiyon. AppleScript temel olarak bir dizi iletişim kutusundan oluşur.

Komut dosyasının ortasında, komut dosyası tuş vuruşuna dayanır ⌘ komutu + C Seçilen zengin metni komut dosyasına eklemek için the clipboard. Kullanıcı, gerçek panoyu ilk iletişim kutusuna yapıştırmak isteyebileceğinden, bu kopyalama komutunun betiğin ortasına düşmesi gerekir.

Hizmetler'deki AppleScript iletişim kutuları varsayılan olarak tüm pencerelerin üstüne sabitlenir; bunu değiştiremezsin.

AppleScript yalnızca tuşa basabilir ⌘ komutu + C altta yatan uygulama odaktayken, mantıklı olan, seçili metni içeren, altta yatan uygulama olduğu (komut dosyası iletişim kutusu değil) olduğu düşünülür.

Bu yüzden sorumumu kararsız bir şekilde koyacağım: Pencerenin üst kısmını Servis diyaloğunun hemen arkasına gri yapmanın ve böylece Servis diyaloğunun üst çubuğunu beyaz yapmanın bir yolu var, ancak senaryo diyalog penceresini hala görüntülemiyor. ?

Pencerenin başlığına veya pencerenin uygulamasına giremiyorum, çünkü bu değişkenler değişecektir. Sabit, odağa getirmek istediğim pencerenin daima Servis diyaloğunun hemen arkasında olacağı yönünde.

Aşağıdaki, neden bahsettiğimin bir örneği:

-- Back up original clipboard contents:
set savedClipboard to the clipboard

set optionList to {"Uppercase case"}
set dialogBoxChoice to choose from list optionList with title "Change case of selection" with prompt "Choose a letter case:"

-- Copy selected text to clipboard:
tell application "System Events" to keystroke "c" using {command down}
delay 1 -- Without this, the clipboard may have stale data.
set theSelectedText to the clipboard

-- Makes the selected text all uppercase:
-- From: http://apple.stackexchange.com/a/171196/184907
set theModifiedSelectedText to (do shell script ("echo " & theSelectedText & " | tr a-z A-Z;"))

display dialog theModifiedSelectedText

-- Overwrite the old selection with the desired text:
set the clipboard to theModifiedSelectedText
tell application "System Events" to keystroke "v" using {command down}
delay 1 -- Without this delay, may restore clipboard before pasting.

-- Restore clipboard:
set the clipboard to savedClipboard

Yukarıdaki kodu klavye kısayolu tetiklemeli bir Servise koyarsanız, betiğin tell application "System Events" to keystroke "c" using {command down}; Böylece, theSelectedText aynı olacaktır savedClipboard her zaman.


Ne yapmaya çalıştığını görebiliyorum ... ama gerçekte ne elde etmeye çalışıyorsun? Basit bir 'seçili metni değiştir' rutinini kesecek diyaloglar getirerek, ihtiyaç duyulmayan seçenekler sunuyor gibi görünmektedir. Kendinizi, kullanıcının kullanmak isteyip istemediğinizi veya geride kalmak isteyip istemediğinizi bilmediğiniz bir modal ile bırakın.
Tetsujin

Temel olarak, betiğin kendisinde söyleyebileceğiniz herhangi bir şeyi 'sistem olaylarına anlatmak' istemezsiniz. kullanım tell me
Tetsujin

@Tetsujin İlk yorumunuzla ilgili olarak, yukarıda eklediğim kod sadece bir örnekti; betiğin asıl kodu değil. Söz konusu kod uzundur ve bu yazının özellikle bu kod tarafından raydan çıkmasını istemedim. Bunun yerine başlıktaki soruya genel bir cevap istedim. Ben sadece sorunu göstermek için yeterince kod ekledim, daha fazlasını değil. Yani, bu yüzden bir choose from list Açıkça saçma olan sadece bir öğenin. Her neyse, çözümün tamamen sorunumu çözdü. Teşekkürler!
rubik's sphere

Yanıtlar:


2

Bu aradığınızı düşündüğüm şeyi yapacak. İş akışına uygun görünmediği için 'seçim seçimini' baştan kaldırdım.

İletişim kutusundan sonra uygulamayı ileriye çağırmak için activeApp değişkenini kullanıyorum. Yönlendirmeyi çağırmak için Sistem Olayları kullanıyorsanız, en öndeki pencereyi geri yüklemez.

Kullanarak tell me yerine tell application "System Events" Gerektiğinde, modal diyaloğun odak noktasını çalmakla ilgili karmaşıklığı önleyebilirsiniz. daha sonra en ön pencerene dönmüyorum.

Ekleme & quoted form of shellscript daha fazla durumda çalışacaktır. Automator kendisi de dahil olmak üzere bazı uygulamalar onsuz hata verecektir.

Automator servisi alıyor no input itibaren any application
Ilerlemeyi gözlemlemek için diyaloglar şeklinde çok fazla hata ayıklama bıraktım.

on run {input, parameters}
    tell me
        tell application "System Events" to set activeApp to name of first application process whose frontmost is true
        -- Back up original clipboard contents:
        set savedClipboard to the clipboard
        display dialog ("Original clip - " & (the clipboard))
        activate application activeApp
        tell application "System Events" to keystroke "c" using command down
        delay 1
        display dialog ("Copied clip - " & (the clipboard))
        set theSelectedText to the clipboard
        set theModifiedSelectedText to do shell script "echo " & quoted form of theSelectedText & " | tr a-z A-Z;"
        display dialog {"Modified clip - " & theModifiedSelectedText}
        activate application activeApp
        set the clipboard to theModifiedSelectedText
        delay 1
        tell application "System Events" to keystroke "v" using {command down}
        -- Restore clipboard:
        delay 1
        set the clipboard to savedClipboard
        display dialog ("Restored clip - " & (the clipboard))
    end tell
    set input to {}
    return input
end run
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.