如何在 OS X 上将进程窗口置于前台?

Posted

技术标签:

【中文标题】如何在 OS X 上将进程窗口置于前台?【英文标题】:How do I bring a processes window to the foreground on OS X? 【发布时间】:2016-01-12 14:33:00 【问题描述】:

我有一个简单的 shell/python 脚本,可以打开其他窗口。我想在脚本完成后将运行脚本的终端带到前台。

我知道我的父窗口的进程 ID。 如何将给定的窗口带到前台?我想我必须一路从 PID 中找出窗口名称。

【问题讨论】:

我认为您的无窗口进程与 Terminal.app 的主窗口没有任何关系。也许您可以找到一种方法让终端获得焦点,而不依赖于您的命令行程序。 我确定桌面可可中有这样的API;就是想不起来了。 @NicolasMiari 我的无窗口进程是终端应用程序的子进程。 【参考方案1】:

不确定是否有正确的方式,但这对我有用:

osascript<<EOF
tell application "System Events"
    set processList to every process whose unix id is 350
    repeat with proc in processList
        set the frontmost of proc to true
    end repeat
end tell
EOF

您也可以使用osacript -e '...'

显然将350 更改为您想要的pid。

【讨论】:

【参考方案2】:

感谢 Mark 的精彩回答! 稍微扩展一下:

# Look up the parent of the given PID.
# From http://***.com/questions/3586888/how-do-i-find-the-top-level-parent-pid-of-a-given-process-using-bash
function get-top-parent-pid () 
    PID=$1:-$$
    PARENT=$(ps -p $PID -o ppid=)

    # /sbin/init always has a PID of 1, so if you reach that, the current PID is
    # the top-level parent. Otherwise, keep looking.
    if [[ $PARENT -eq 1 ]] ; then
        echo $PID
    else
        get-top-parent-pid $PARENT
    fi


function bring-window-to-top () 
    osascript<<EOF
    tell application "System Events"
        set processList to every process whose unix id is $1
        repeat with proc in processList
            set the frontmost of proc to true
        end repeat
    end tell
EOF

然后你可以运行:

bring-window-to-top $(get-top-parent-pid)

快速测试使用:

sleep 5; bring-window-to-top $(get-top-parent-pid)

然后换成别的东西。 5 秒后,运行您的脚本的终端将被发送到顶部。

【讨论】:

干得好 - 感谢您与社区分享您的努力:-)

以上是关于如何在 OS X 上将进程窗口置于前台?的主要内容,如果未能解决你的问题,请参考以下文章

MainWindowHandle 为 0 时将窗口置于前台

如何将我的窗口投影为前台的活动窗口

在 Mac OS X 上将代码粘贴到终端窗口中的 vim

如何在 OS X 上将 Python 的默认版本设置为 3.x? [复制]

如何在Mac OS X上将PDF转换为Microsoft Word

从 Access 将 Excel 窗口置于前台