前面に単一ウィンドウを上げるためのスクリプト


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のどちらにも慣れていませんが、これは(最終的には)シェルスクリプトから呼び出されることになるので、そこからどこへ行くのかわからないです。

回答:


5

open 単一のウィンドウのみを表示します。

do shell script "open -a Terminal"

ウィンドウを表示するもう1つの方法は、そのインデックスを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

というのは、 クリック ウィンドウ上では、目的の効果があります。それで、なぜそれがプログラムで不可能になるのかわからない。私はこのWebページを見つけました( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front )Obj-C / Cocoaで呼び出します。 SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); objcもcocoaも、そこからどこへ行くべきかを知るのに十分なほど精通していません。
crowding

3

アクティブではないアプリケーションのメニュー項目をクリックできます。これを使用して、ウィンドウ内のウィンドウに対応するメニュー項目をクリックします。 メニュー。

これがあなたのスクリプトに挿入する必要があるものです。

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ブラウザか何かを持っているならば、それは目に見える影響を及ぼさない:
crowding

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を使用してアプリケーションを「起動」します。これにより、そのアプリケーションの最前面のウィンドウだけが前面に表示されます。これを私にもたらしたプロセスの詳細については、私は私のウェブサイトでより徹底的な記事を書いています ここに

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.