Подтвердить что ты не робот

Как активировать приложение Mac OS X с данным идентификатором процесса?

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

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

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

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

4b9b3361

Ответ 1

Если вы не хотите/не можете установить какое-либо дополнительное программное обеспечение, есть встроенный способ поиска идентификаторов процессов и приложений: 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

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

Изменить - извините, я не понял этот вопрос.

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

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

Ответ 2

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

Учитывая, что по определению может быть только один процесс - PID (идентификаторы процессов) однозначно идентифицируют один процесс - нет необходимости в цикле: он просто нацелен на первый - и только по определению - элемент списка 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')

Ответ 3

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

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

Что это!