2010-02-19 3 views
16

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

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

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

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

ответ

10

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

ограничить результат только соответствующий line, проложить его до такой степени как grep

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

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

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

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

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 
+0

Я знаю это, но это не интересно для меня. Как я уже объяснил в своем вопросе, я уже знаю название приложения, но их несколько. Единственный способ, которым я могу различать их, - это идентификатор процесса, который я знаю. –

+0

О, я вижу. См. Править выше. – stib

+3

+1 для фильтра ', чей unix id is ...', но нет необходимости в _loop_; просто нацелитесь на «первый процесс, чей unix id ...». – mklement0

2

Вот мое решение, с питоном и AppleScript:

  1. Установите appscript
  2. Run appscript.app(pid=<yourpid>).activate()

Вот так!

7

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

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