Сценарій, щоб підняти одне вікно на передню частину


8

У сценарії я намагаюся знайти вікно Terminal.app, що містить певний пристрій tty, і піднести це вікно доверху. Ось що я маю в Applescript поки що:

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

Де я застрягаю - це частина "піднімаючи вікно".

Ось кілька речей, які не зовсім те, що я хочу:

set frontmost of theWin to true - це приводить вікно до передньої частини групи вікон Terminal.app, але не піднімає його над будь-якими іншими вікнами.

tell application "Terminal" to activate- це приносить кожне вікно терміналу на передній план у великій групі. Я просто хочу одне вікно.

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

Це майже так, але це потрібно, щоб підняти вікно терміналу до позиції №2, все ще під активним вікном (якщо активний додаток - це щось інше, ніж Terminal.app.)

click theSysWin at {10,50} - схоже, нічого не робить.

click first static text of theSysWin - схоже, нічого не робить.

Чи є спосіб це зробити? Це не повинно бути в Applescript.

EDIT Я знайшов цю веб-сторінку ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ), цитуючи дзвінок Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Я не знайомий ні з ObjC, ні з какао, і це (в кінцевому рахунку) викликає сценарій оболонки, тому не знаю, куди звідти піти.

Відповіді:


5

open піднімає лише одне вікно:

do shell script "open -a Terminal"

Ще один спосіб підняти вікно - встановити його індекс на 1, а потім використовувати 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

Я маю на увазі, натискання на вікно має бажаний ефект. Тож не впевнений, чому це було б неможливо програмно. Я знайшов цю веб-сторінку ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) з викликом Obj-C / Cocoa: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); я недостатньо знайомий ні з objc, ні з какао щоб знати, куди піти звідти, хоча.
скупчення

4

Ви можете натиснути пункти меню програм, які не активні. Використовуйте його, щоб натиснути на пункт меню, що відповідає вікну в меню Вікно .

Це те, що потрібно вставити у свій сценарій:

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

Хоча вона не активує програму, вікно передує.


Майже! Він піднімає вікно над усіма іншими вікнами, Окрім самого верхнього вікна активної програми. Тож якщо у мене веб-браузер максимізований або щось подібне, це не має видимого ефекту: /
скупчення

Це вирішило проблему, в якій я отримував помилку, коли "AXRaise" не розумів дії "виконувати" ...
ttt,

2

Я усвідомлюю, що ця нитка досить стара, але я натрапив на неї, боровся з тією ж проблемою, і інші можуть також. Наскільки я можу сказати, це не можна зробити в сирому AppleScript. Однак це можна зробити в AppleScriptObjC. Щоб використовувати приклад від @Daniel Beck, нова версія буде такою.

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

Доданий код використовує клас "какао" NSWorkspace для "запуску" програми, що піднімає лише переднє вікно цієї програми на передню частину з фокусом. Для більш детальної інформації про процес, який привів мене до цього, я маю більш ретельне написання на своєму веб-сайті тут .


0

Ось ще одна спроба, протестована на macOS High Sierra. На жаль, це працює лише тоді, коли дане вікно знаходиться на поточному робочому столі! API AppleScript для управління вікнами здається неповним, що робить це неможливим.

Замініть "Safari" та "WhatsApp" для вашого випадку використання.

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

Однак це (видимо) піднімає вікна в два кроки. Він спочатку піднімає вікно у верхню частину вікон програми, а вже потім піднімає його до верху всіх вікон. Не ідеальний, але функціональний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.