如何使用给定的进程ID激活Mac OS X应用程序?

时间:2010-02-19 14:04:42

标签: macos applescript

我知道Mac OS X中应用程序的进程ID。如何切换到它(使用applescript,python或其他)?

通过“切换”,我的意思是,把焦点放在一边。

通常的解决方案是使用applescript代码tell application "Foo" activate,但这里的名称没用,因为我有许多同一个应用程序运行的实例。然而,我能够获得应用程序的进程ID。

如何以编程方式切换到此应用程序?

3 个答案:

答案 0 :(得分:9)

如果您不想/无法安装任何其他软件,可以通过内置方式查找进程ID和应用程序: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

通过解析答案,您可以找到该应用程序的名称。这可能有点棘手,因为结果将显示用于应用程序的实际命令,而不是应用程序名称(如果您查看示例,您将看到可以通过在结果中查找something.app来找到它)

编辑 - 抱歉,我误解了这个问题。

你可以使用系统事件来做到这一点(原来比使用shell更容易):

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

答案 1 :(得分:7)

@stib's answer有效,但可以简化:

根据定义,只有一个进程可以匹配 - PID(进程ID)唯一标识一个进程 - 不需要循环:只需直接定位 - 按照定义 - 元素过滤器process whose unix id is ...返回的PID列表:

# 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
  "
}

示例调用(假设在当前shell中定义或来源activateByPid):

# Activate Safari by its PID.
activateByPid $(pgrep -x 'Safari')

答案 2 :(得分:2)

这是我的解决方案,使用python和applescript:

  1. 安装appscript
  2. 运行appscript.app(pid=<yourpid>).activate()
  3. 就是这样!