代码之家  ›  专栏  ›  技术社区  ›  Olivier Verdier

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

  •  17
  • Olivier Verdier  · 技术社区  · 14 年前

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

    我的意思是,把焦点放在“开关”上。

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

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

    3 回复  |  直到 14 年前
        1
  •  9
  •   stib    14 年前

    如果您不想/不能安装任何其他软件,有一种内置的方法来查找进程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
    
        2
  •  7
  •   Community noseratio    7 年前

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

    仅根据定义 进程可以匹配-PIDS(进程ID)唯一标识单个进程-存在 不需要循环:直接针对 第一 -根据定义 只有 元素 过滤器返回的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 在当前shell中定义或源于此):

    # Activate Safari by its PID.
    activateByPid $(pgrep -x 'Safari')
    
        3
  •  2
  •   Olivier Verdier    14 年前

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

    1. 安装 appscript
    2. appscript.app(pid=<yourpid>).activate()

    就是这样!