Скрипт для поднятия одного окна вперед

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.

РЕДАКТИРОВАТЬ Я нашел эту веб-страницу ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) со ссылкой на вызов Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Я не знаком ни с ObjC, ни с Cocoa, и это (в конечном счете) вызывается из сценария оболочки, поэтому не уверен, куда идти дальше.

сгущение
источник

Ответы:

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
LRI
источник
Я имею в виду, нажатие на окно имеет желаемый эффект. Так что не уверен, почему это было бы невозможно программно. Я нашел эту веб-страницу ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) с помощью вызова Obj-C / Cocoa: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); я недостаточно знаком с objc или cocoa чтобы знать, куда идти оттуда, хотя.
скучно
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» не понимая «выполнить» действия ...
ТТТ
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

Однако это (заметно) поднимает окна в два этапа. Сначала он поднимает окно к вершине окон приложения, а только затем поднимает его к вершине всех окон. Не идеально, но функционально.

Брехт Мачиэльс
источник