Как активировать приложение Mac OS X с заданным идентификатором процесса? - PullRequest
17 голосов
/ 19 февраля 2010

Я знаю идентификатор процесса приложения в Mac OS X. Как я могу переключиться на него (используя applecript, или python, или что-то еще)?

Под «переключателем» я имею в виду фокус.

Обычное решение - использовать код appleScript tell application "Foo" activate, но здесь это имя бесполезно, потому что у меня много экземпляров одного и того же приложения. Однако я могу получить идентификатор процесса приложения.

Как программно переключиться на это приложение?

Ответы [ 3 ]

9 голосов
/ 08 марта 2010

Если вы не хотите / не можете устанавливать дополнительное программное обеспечение, есть встроенный способ поиска идентификаторов процессов и приложений: ps.

ps - полезный инструмент командной строки длянайти информацию о запущенных процессах.Чтобы найти конкретное приложение по номеру процесса (который я назначил переменной myProcessId):

do shell script "ps -p " & myProcessId

это вернет результат, подобный этому

  PID TTY           TIME CMD
66766 ??         9:17.66 /Applications/Firefox.app/Contents/MacOS/firefox-bin -psn_0_3793822

, чтобы ограничить результатпросто к соответствующей строке, направьте ее в grep следующим образом:

do shell script "ps -p " & myProcessId & "|grep " & myProcessId

С помощью анализа ответа вы можете найти название приложения.Это может быть немного сложнее, потому что в результате будет показана фактическая команда, используемая для приложения, а не имя приложения (если вы посмотрите на пример, то увидите, что его можно найти, найдя что-то в приложении.).

Редактировать - извините, я неправильно понял вопрос.

Вы можете сделать это с системными событиями (в любом случае оказывается, что это намного проще, чем копаться в оболочке):

tell application "System Events"
    set theprocs to every process whose unix id is myProcessId
    repeat with proc in theprocs
        set the frontmost of proc to true
    end repeat
end tell
7 голосов
/ 09 апреля 2014

@ stib's answer работает, но может быть упрощено:

Учитывая, что по определению может совпадать только один процесс - PID (идентификаторы процесса) однозначно идентифицируют один процесс - цикл не нужен: просто непосредственно нацелен на first - и по определению только - элемент списка PID, возвращаемых фильтром process whose unix id is ...:

# Assumes that variable `myProcessId` contains the PID of interest.
tell application "System Events"
  set frontmost of the first process whose unix id is myProcessId to true
end tell

ehime предоставил следующую bash функцию-оболочку:

# Pass the PID as the 1st (and only) argument.
activateByPid()
{
  osascript -e "
    tell application \"System Events\"
      set frontmost of the first process whose unix id is ${1} to true
    end tell
  "
}

Пример вызова (предполагается, что activateByPid было определено или получено в текущей оболочке):

# Activate Safari by its PID.
activateByPid $(pgrep -x 'Safari')
2 голосов
/ 19 февраля 2010

Вот мое решение с python и applecript:

  1. Установить appscript
  2. Выполнить appscript.app(pid=<yourpid>).activate()

Вот и все!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...