将单个窗口提升到最前面的脚本


8

在脚本中,我试图找到包含特定tty设备的Terminal.app窗口,并将该窗口提升到顶部。到目前为止,这是我在Applescript中所拥有的:

tell application "System Events"
  set foundWin to false
  if (name of processes) contains "Terminal" then
    tell application "Terminal"
      set theTabs to first tab of every window where tty is "$(tty)"
      repeat with theTab in theTabs
        if class of theTab is tab then
          set theWin to (first window whose tabs contains theTab)
          set selected tab of theWin to theTab
          set foundWin to true
        end if
      end repeat
    end tell
  end if
  if foundWin then
    --RAISE THE WINDOW?!
  end if
end tell

我陷入困境的是“提高窗口”部分。

这是我所不想要的一些东西:

set frontmost of theWin to true -这会将窗口移到Terminal.app窗口组的最前面,但不会使其高于其他任何窗口。

tell application "Terminal" to activate-这将每个终端窗口都放在一个大堆栈中。我只想要一个窗口。

tell application "System Events"
    set theSysWin to first window of process "Terminal" whose name is (name of theWin)
    perform action "AXRaise" of theSysWin
end tell

这几乎可以做到,但是要做的是将终端窗口提升到#2位置,仍在活动窗口的下方(如果活动应用不是Terminal.app,则为其他)。

click theSysWin at {10,50} -似乎什么也没做。

click first static text of theSysWin -似乎什么也没做。

有没有办法做到这一点?它不必在Applescript中。

编辑我确实找到此网页(http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/)引用了Obj-C / Cocoa的电话:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

我对ObjC或Cocoa都不熟悉,(最终)这是从shell脚本中调用的,因此不确定从那里去哪里。

Answers:


5

open 仅引发一个窗口:

do shell script "open -a Terminal"

引发窗口的另一种方法是将其索引设置为1,然后使用AXRaise:

tell application "Terminal"
    set index of window 2 to 1
end tell
tell application "System Events" to tell process "Terminal"
    perform action "AXRaise" of window 1
end tell

我的意思是,单击窗口具有预期的效果。所以不确定为什么在编程上是不可能的。我确实通过Obj-C / Cocoa呼叫找到了此网页(blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front): SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); 我对objc或cocoa不够熟悉知道从那里去哪里。
2012年

4

您可以单击不活动的应用程序的菜单项。用它来单击对应窗口中的菜单项窗口菜单中。

这是您需要在脚本中插入的内容:

tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
    end tell
end tell

虽然它不激活程序,但窗口位于最前面。


几乎!除了活动应用程序的最顶层窗口外,它还会将窗口升高到所有其他窗口之上。因此,如果我已最大化Web浏览器或其他功能,那么它不会产生明显的效果:/
拥挤了

这解决了我遇到的问题,即我无法理解“ perform”操作而出现“ AXRaise”错误...
ttt

2

我意识到这个线程已经很老了,但是我在遇到相同问题时碰到了它,其他人也可能遇到这个问题。据我所知,它不能在原始AppleScript中完成。可以在AppleScriptObjC中完成。要使用@Daniel Beck的示例,新版本将如下所示。

property NSWorkspace : class "NSWorkspace"
set workspace to NSWorkspace's sharedWorkspace()
tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
        workspace's launchApplication_("Terminal")
    end tell
end tell

添加的代码将使用Cocoa类NSWorkspace来“启动”该应用程序,这只会将该应用程序的最前面的窗口聚焦到最前面。有关将我带入这一过程的更多详细信息,请在此处的网站上进行更详尽的介绍。


0

这是在macOS High Sierra上测试的另一种尝试。las,这仅在给定窗口位于当前桌面上时才有效!用于控制窗口的AppleScript API似乎不完整,因此无法实现。

用“ Safari”和“ WhatsApp”代替您的用例。

tell application "System Events"
    tell process "Safari"
        try
            set theWindow to (first window whose name contains "WhatsApp")
            perform action "AXRaise" of theWindow
            do shell script "open -a Safari"
        end try
    end tell
end tell

但是,这确实(明显地)分两步升高了窗户。它首先将窗口提升到应用程序窗口的顶部,然后才将其提升到所有窗口的顶部。不完美,但实用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.