Script untuk menaikkan satu jendela ke depan

8

Dalam skrip saya mencoba menemukan jendela Terminal.app yang berisi perangkat tty tertentu dan menaikkan jendela itu ke atas. Inilah yang saya miliki di Applescript sejauh ini:

tell application "System Events"
  set foundWin to false
  if (name of processes) contains "Terminal" then
    tell application "Terminal"
      set theTabs to first tab of every window where tty is "$(tty)"
      repeat with theTab in theTabs
        if class of theTab is tab then
          set theWin to (first window whose tabs contains theTab)
          set selected tab of theWin to theTab
          set foundWin to true
        end if
      end repeat
    end tell
  end if
  if foundWin then
    --RAISE THE WINDOW?!
  end if
end tell

Di mana saya terjebak adalah bagian "menaikkan jendela".

Berikut beberapa hal yang tidak saya inginkan:

set frontmost of theWin to true - ini membawa jendela ke depan kelompok Terminal.app windows tetapi tidak menaikkannya di atas jendela lain.

tell application "Terminal" to activate- ini membawa setiap jendela Terminal ke depan dalam tumpukan besar. Saya hanya ingin satu jendela.

tell application "System Events"
    set theSysWin to first window of process "Terminal" whose name is (name of theWin)
    perform action "AXRaise" of theSysWin
end tell

Ini hampir berhasil, tetapi yang dilakukannya adalah menaikkan jendela terminal ke posisi # 2, masih di bawah jendela aktif (jika aplikasi yang aktif adalah sesuatu selain Terminal.app.)

click theSysWin at {10,50} - sepertinya tidak melakukan apa-apa.

click first static text of theSysWin - sepertinya tidak melakukan apa-apa.

Apakah ada cara untuk melakukan ini? Tidak harus dalam Applescript.

EDIT Saya menemukan halaman web ini ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) mengutip panggilan Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Saya tidak akrab dengan ObjC atau Cocoa, dan ini (pada akhirnya) dipanggil dari skrip shell, jadi tidak yakin ke mana harus pergi dari sana.

kesesakan
sumber

Jawaban:

5

open hanya memunculkan satu jendela:

do shell script "open -a Terminal"

Cara lain untuk menaikkan jendela adalah dengan mengatur indeksnya menjadi 1 dan kemudian menggunakan AXRaise:

tell application "Terminal"
    set index of window 2 to 1
end tell
tell application "System Events" to tell process "Terminal"
    perform action "AXRaise" of window 1
end tell
Lri
sumber
Maksud saya, mengklik pada jendela memiliki efek yang diinginkan. Jadi tidak yakin mengapa itu tidak mungkin secara terprogram. Saya menemukan halaman web ini ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) dengan Obj-C / Cocoa call: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); Saya tidak cukup akrab dengan objc atau cocoa untuk tahu ke mana harus pergi dari sana.
Berkerumun
4

Anda dapat mengklik item menu aplikasi yang tidak aktif. Gunakan untuk mengklik item menu yang sesuai dengan jendela di menu Window .

Inilah yang perlu Anda masukkan ke dalam skrip Anda:

tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
    end tell
end tell

Meskipun tidak mengaktifkan program, jendelanya adalah yang paling depan.

Daniel Beck
sumber
Hampir! Ini memunculkan jendela di atas semua jendela lain KECUALI jendela paling atas dari aplikasi yang aktif. Jadi jika saya punya browser web dimaksimalkan atau sesuatu, itu tidak memiliki efek yang terlihat: /
crowding
Ini menyelesaikan masalah yang saya alami di mana saya mendapatkan kesalahan dengan "AXRaise" tidak memahami tindakan "perform" ...
ttt
2

Saya menyadari bahwa utas ini sudah cukup lama, tetapi saya berlari melintasinya saat melawan masalah yang sama dan yang lainnya mungkin juga. Sejauh yang saya tahu itu tidak dapat dilakukan di AppleScript mentah. Ini bisa dilakukan di AppleScriptObjC. Untuk menggunakan contoh dari @Daniel Beck, versi baru akan seperti ini.

property NSWorkspace : class "NSWorkspace"
set workspace to NSWorkspace's sharedWorkspace()
tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
        workspace's launchApplication_("Terminal")
    end tell
end tell

Kode yang ditambahkan akan menggunakan NSWorkspace kelas Cocoa untuk "meluncurkan" aplikasi, yang hanya memunculkan jendela depan aplikasi itu ke depan dengan fokus. Untuk detail lebih lanjut tentang proses yang membawa saya ke ini, saya memiliki artikel yang lebih lengkap di situs web saya di sini .

Tom Scogland
sumber
0

Inilah upaya lain, diuji pada macOS High Sierra. Sayangnya, ini hanya berfungsi ketika jendela yang diberikan ada di desktop saat ini! API AppleScript untuk mengontrol windows tampaknya tidak lengkap, membuat ini tidak mungkin.

Ganti "Safari" dan "WhatsApp" untuk kasus penggunaan Anda.

tell application "System Events"
    tell process "Safari"
        try
            set theWindow to (first window whose name contains "WhatsApp")
            perform action "AXRaise" of theWindow
            do shell script "open -a Safari"
        end try
    end tell
end tell

Ini memang (tampak) meningkatkan windows dalam dua langkah, namun. Pertama-tama menaikkan jendela ke bagian atas jendela aplikasi, dan hanya kemudian menaikkannya ke bagian atas semua jendela. Tidak sempurna, tetapi fungsional.

Brecht Machiels
sumber