AppleScript'te hangi ekranın menü çubuğunu bulduğunu nasıl öğrenirsiniz?


3

AppleScript ile oynamak Birkaç pencerenin konumunu değiştirmek istiyorum positionancak monitörü tanımlamakta sorun yaşıyorum. Şu anda seyahatlerim sırasında MacBook'umla bağlantı kurduğum birkaç farklı boyut ve marka monitörüm var. Bağlandığım dört monitörün hepsinde yinelenen tek olay, değiştirmek istediğim monitörün menü çubuğunu içermesidir.

Test ederken do shell script "system_profiler SPDisplaysDataType, döndürülen metnin Main Display: Yes, menü çubuğunun çıkartma işleminden kaynaklandığı ana olarak kabul edilip edilmediğinden emin değilim :

Graphics/Displays:

    Intel Iris Pro:

      Chipset Model: Intel Iris Pro
      Type: GPU
      Bus: Built-In
      VRAM (Dynamic, Max): 1536 MB
      Metal: Supported
      Displays:
        Color LCD:
          Display Type: Built-In Retina LCD
          Resolution: 2880 x 1800 Retina
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: Yes
          Connection Type: DisplayPort
        Thunderbolt Display:
          Display Type: LCD
          Resolution: 2560 x 1440
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: No
          Connection Type: DisplayPort

Eğer benim varsayımım Main Displaydoğruysa, tanımlanmış ana ekranın çözünürlüğünü nasıl düzgünce açmalıyım ki pencereleri değiştireyim?

Araştırma yaptığımda, her bir ekrana genellikle bir adım atılacağı anlaşılıyor:

Bu yüzden, bunun bir arada iki soru olup olmayacağını bilmiyorum. Birden fazla monitöre bağlanırken sekansın nasıl belirlendiğine biraz şaşırdım (örneğin bugün yıldırım ekranına bağlı olabilirim ama yarın iki DisplayPorts aracılığıyla iki Dell monitörüne bağlı olabilirim) ve eğer bir yol varsa özellikle menü çubuğunu temel alarak bir monitörü hedefleyin.

Uygulamayı zaten görebiliyorum ve onun boyutu:

tell application "System Events" to tell application process "Notes" to set theSize to get size of window 1
set theWidth to item 1 of theSize
set theHeight to item 2 of theSize

Ancak sorunum kararın belirlenmesinde düşüyor, böylece hesaplamayı positionve boundsuygulama penceresini taşıyabilirim.

Yanıtlar:


3

GÜNCELLEŞTİRME

Orijinal cevabımı kaldırdım. Özgün çözümüm yerine tercih ettiğim tamamen farklı bir yaklaşım. Bu sürüm aslında “Image Events” komut dosyası eklemesi kullanıyor.

Bu komut dosyası, bilgisayarınıza bağlı ekranların adlarını alır. “Ekran 1” ekranının döndürülen değerleri daima “AppleScript'te hangi menü çubuğuna sahiptir?” Olacaktır.

property activeDesktop : missing value
property activeDesktopResolution : missing value

set displayNames to {}

tell application "Image Events"
    set theDisplays to displays
    repeat with i from 1 to number of items in theDisplays
        set this_item to item i of theDisplays
        set theName to name of display profile of item i of theDisplays
        set end of displayNames to theName
        set activeDesktop to item 1 of displayNames
    end repeat
end tell

tell application "Finder"
    set activeDesktopResolution to bounds of window of desktop
    set activeDesktopResolution to items 3 thru 4 of activeDesktopResolution
end tell

set theResultz to display dialog activeDesktop & "  " & item 1 of activeDesktopResolution & " x " & item 2 of activeDesktopResolution ¬
    buttons ¬
    "OK" with title ¬
    "Your Current Display and Its Resolution" with icon 1 ¬
    giving up after 10

görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin


2

Testlerimde, ana ekranın Displays Sistem Tercihleri'nde atanmış menüye sahip olduğu doğru. Menü çubuğunu bir ekrandan diğerine taşıyarak ve komut dosyanızı çalıştırarak test ettim. Sonuçlar, menü çubuğunun olduğu her yerde, o göstergenin bilgisinde "Ana Ekran: Evet" olacağını gösterir.

Çözünürlüğü ayrıştırmak için, aramam gereken bazı tutarlı metinler elde etmek için -xml argümanını system_profiler komutuna, sonra da verileri ayrıştırmak için Apple'ın metin öğesi sınırlayıcılarını kullanırdım. Bu betiği yazdım ve menüyü ileri geri değiştirdiğimde, mevcut ana ekranın çözünürlüğünü döndürüyor. İşletim sisteminizin sistem profilier raporu için ne getirdiğine bağlı olarak sınırlayıcıları ince ayar yapmanız gerekebilir.

Komut dosyasının ne yaptığını açıklamak için aşağıdaki kodda satır içi yorumlar ekledim.

set pfl to do shell script "system_profiler -xml SPDisplaysDataType"

set tid to text item delimiters
set text item delimiters to "</data><key>_name</key>"--in my reports, each display section starts with this xml code

ignoring white space --allows us to not worry about returns, tabs, spaces, etc.
    repeat with i from 2 to count of pfl's text items
        set aDisplay to pfl's text item i
        if aDisplay contains "<key>spdisplays_main</key><string>spdisplays_yes</string>" then--check if this display is the main
            set text item delimiters to "<key>_spdisplays_resolution</key><string>"--this is the xml code for the resolution
            set displayRes to aDisplay's text item 2
            set text item delimiters to "</string"--remove the ending xml code
            set displayRes to displayRes's text item 1
        end if
    end repeat
end ignoring
set text item delimiters to tid --always text text item delimiters back to default
return displayRes

EDIT: Yukarıdaki system_profiler'ın normal formunu gönderdiğiniz için, bu çıktının ayrıştırılması için komut dosyasını yeniden yazdım. Bana xml kullanmaktan biraz daha riskli görünüyor, ancak sisteminizde herhangi bir tweaks olmadan derlemeli ve düzgün çalışması gerekir.

set pfl to do shell script "system_profiler SPDisplaysDataType"
set tid to text item delimiters
set text item delimiters to "Displays:"
set pfl to text item 3 of pfl
set text item delimiters to "Mirror:"
repeat with i from 1 to count of pfl's text items
    set aDisplay to pfl's text item i
    ignoring white space
        if aDisplay contains "Main Display: Yes" then
            if aDisplay contains "Resolution:" then
                set text item delimiters to "Resolution: "
                set displayRes to text item 2 of aDisplay
                considering white space
                    set text item delimiters to "\r" --line breaks should be \r
                    set displayRes to text item 1 of displayRes
                    set text item delimiters to "\n" --or they might be \n
                    set displayRes to text item 1 of displayRes
                end considering
            end if
        end if
    end ignoring
    set text item delimiters to "Mirror:"
end repeat
set text item delimiters to tid
return displayRes

Kodunuzu Komut Dosyası Düzenleyicisine kopyalayıp yapıştırırsam derlenirken hata verir. Çalışması için gönderdiğiniz koddaki bir şeyi değiştirmem gerekiyor mu, öyleyse ne olacak?
user3439894

Metin öğesi sınırlayıcılarına ayarladığım öğelerin sisteminizde aynı olduğundan emin olmak için muhtemelen döndürdüğü xml raporunu kontrol etmeniz gerekir. Sisteminizin geri döndüğünü görmek için ilk kod satırından hemen sonra "return pfl" kod satırını ekleyebilirsiniz. Örneğin, raporunuzda "</data> <key> _name </key>" mevcut değilse (beyaz boşluk yok sayılıyorsa), raporunuzda ekranın adından hemen önce geleni değiştirmek zorunda kalırsınız. "<key> _spdisplays_resolution </key> <string>" mevcut değilse, uygun şekilde değiştirin. Sierra 10.12.6 kullanıyorum, dif raporlu bir dif versiyonunuz olabilir.
Hurston

Eğer xml'yi buraya göndermek istiyorsanız (bu betiğin içindeki pfl dosyası), sınırlayıcıları arayacağım ve onu yansıtacak şekilde betiği revize edeceğim.
Hurston

Kodlanmış olarak güncellemeniz öncü bir boşlukla döner, örneğin " 2560 x 1440"ancak sonra bir boşluk eklerseniz Resolution, örneğin set text item delimiters to "Resolution: "kaldırır, örn."2560 x 1440"
user3439894

boşluk eklendi.
Hurston

2

MacBook Pro'mda bir Thunderbolt Ekranı ve üzerinde Menü Çubuğu takılıyken test edildi ;

set theMainDisplayName to do shell script "system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'"
return theMainDisplayName

Result:
"Thunderbolt Display:"

Ben geçerseniz menü çubuğu için MacBook Pro , bu döndüren isim arasında Display yerine, bunun adının bir Thunderbolt Display .

İçin Karar benim bir Thunderbolt Display :

set theMainDisplayResolution to do shell script "system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'"
return theMainDisplayResolution

Result:
"2560 x 1440"

Ben geçerseniz menü çubuğu için MacBook Pro , Döndürdüğü çözünürlüğü ait Display yerine, bunun çözünürlük ve Thunderbolt Display .


Ayrıca, benim cevaplara bir göz Senaryo çift monitör üzerinde menü çubuğu set-up taşınmaya ve programlı OS X ekran düzenleme değiştirme Ayrıca yarayabilecek üçüncü taraf araçlardan bir çift için.

Not: Yukarıdaki bağlantılarda cevaplarımda belirtilen ve kullanılan yardımcı programların geliştiricileri ile hiçbir bağlantım yok.


Hakkında biraz anlamak kabuk komutları kullanılan do shell script komutlar :

Komutanlığı kısmı do shell script komutu :

system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'
  • system_profiler - Sistem donanım ve yazılım konfigürasyonunu rapor eder.
    • SPDisplaysDataType - Yalnızca Grafikler ve Ekranlar hakkında bir metin raporu oluşturur.
  • |Boru doğrudan çıkışını geçmeden bir komutu için girdi sonrakinin komuta .
  • grep- Dosya kalıbı arama. Grep yarar bir veya birden fazla kalıplarıyla eşleşen satırları seçerek verilen herhangi bir giriş dosyaları arar.
    • −B num- Her maçtan önce baştaki bağlamın sayılarını yazdır
    • 'Main Display:' Eşleşecek model.
  • |Boru doğrudan çıkışını geçmeden bir komutu için girdi sonrakinin komuta .
  • awk - Desene yönelik tarama ve işleme dili.
    • sub(/^[ \t]+/, \"\")- Yedek Dize İşlevi - sub(regexp, replacement)- Bu durumda önde gelen boşlukları kaldırmak için kullanılır.
      • ^ - İpin başlangıcındaki konumunu belirler.
      • [ \t] - Listede bulunan tek bir karakteri eşleştirin.
        • space- spaceKarakteri tam anlamıyla eşleştirir. Not spaceTek bir boşluk karakteri (ASCII 32) belirtmek için burada kullanılır.
        • \t - Bir sekme karakteriyle eşleşir (ASCII 9).
      • + - Bir ile sınırsız zaman arasında, olabildiğince çok kez eşleşir ve gerektiğinde geri döner (açgözlü).
      • \"\"- Değişimi hiçbir şey ile ( ""). "", Öncelenir \, bu nedenle komut kabuğuna derlenmiş ve geçirilebilir. Doğrudan komut satırına girilirse "", bunun kaçması gerekmez.
    • print $0- Tüm kaydı yazdırır. - Bu durumda yukarıdaki beşinci satırı yazdırır Main Display:, önde gelen boşluk san.
    • exit- İlk kaydı yazdırdıktan sonra çıkar .

Komutanlığı kısmı do shell script komutu :

system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'

Bu ise do shell script komutaawk '/Resolution:/{print $2,$3,$4}' kısmı şunları yapar:

Çıktı örn:

$ system_profiler SPDisplaysDataType | grep -B 3 'Main Display:'
          Resolution: 2560 x 1440
          Pixel Depth: 32-Bit Color (ARGB8888)
          Display Serial Number: C08Z4120F6FB
          Main Display: Yes
$

Alır borulu için awkve arar girişi bir için kayıt içeren Resolution:aşağıdaki bulur kayıt maçı:

          Resolution: 2560 x 1440

print $2,$3,$4 Komut , ikinci, üçüncü ve dördüncü yazdırır alanları arasında rekor . ,Arasında virgül $n alanlarına bir yerleştirmektir alanı . Çıkış sahiptir:

2560 x 1440

Grep -B 3, üç satırdan önce var mı ve bu awk altlığı mı? Grep awk bir koparma için bir artı ve basmak da başkalarına yardımcı olacaktır.
ᴅ2ᴅ2

@ DᴀʀᴛʜVᴀᴅᴇʀ, Evet, grep -B 3önce üç çizgi dahil etmektir maç ve ben kaldırıldı yerine işlevini gelen awkkomuta Resolution:gerçekten orada gerekli değildi çünkü. Birkaç saatliğine dışarı çıkıyorum ve biraz sonra bir mola vereceğim. Bununla birlikte, şahsen muhtemelen cscreenbilgiyi kullanıp ayrıştırırım ve system_profilerüçüncü taraf yardımcı programlarını kullanmadığınız sürece bir örnek de eklerim.
user3439894

Şahsen yerleşik olarak kullanmayı tercih ediyorum ama diğerleri bunu üçüncü tarafların yapabilecekleri ile ilgili ilginç bulabilir.
ᴅ2ᴅ2

@ DᴀʀᴛʜVᴀᴅᴇʀ, ne hakkında bir açıklama cevabını güncellemek ettik kabuk komutları arasında do shell script komutlar yapıyoruz.
user3439894
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.