Skript zum Anheben eines einzelnen Fensters nach vorne

8

In einem Skript versuche ich, das Terminal.app-Fenster mit einem bestimmten tty-Gerät zu finden und dieses Fenster nach oben zu heben. Folgendes habe ich bisher in 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

Wo ich stecken bleibe, ist der Teil "Fenster öffnen".

Hier sind einige Dinge, die nicht ganz das sind, was ich will:

set frontmost of theWin to true - Dadurch wird das Fenster an die Vorderseite der Gruppe der Terminal.app-Fenster verschoben, aber nicht über andere Fenster angehoben.

tell application "Terminal" to activate- Dies bringt jedes Terminalfenster in einem großen Stapel nach vorne. Ich will nur das eine Fenster.

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

Dies macht es fast, aber es bewirkt, dass das Terminalfenster auf die Position Nr. 2 angehoben wird, die sich noch unter dem aktiven Fenster befindet (wenn die aktive App etwas anderes als Terminal.app ist).

click theSysWin at {10,50} - scheint nichts zu tun.

click first static text of theSysWin - scheint nichts zu tun.

Gibt es eine Möglichkeit, dies zu tun? Es muss nicht in Applescript sein.

BEARBEITEN Ich habe diese Webseite ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) gefunden, auf der ein Obj-C / Cocoa-Aufruf zitiert wurde:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Ich bin weder mit ObjC noch mit Cocoa vertraut, und dies wird (letztendlich) von einem Shell-Skript aufgerufen, daher bin ich mir nicht sicher, wohin ich von dort aus gehen soll.

Gedränge
quelle

Antworten:

5

open öffnet nur ein einziges Fenster:

do shell script "open -a Terminal"

Eine andere Möglichkeit, ein Fenster zu öffnen, besteht darin, seinen Index auf 1 zu setzen und dann AXRaise zu verwenden:

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
Lri
quelle
Ich meine, ein Klick auf das Fenster hat den gewünschten Effekt. Also nicht sicher, warum es programmatisch unmöglich wäre. Ich habe diese Webseite ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) mit Obj-C / Cocoa-Aufruf gefunden: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); Ich bin weder mit objc noch mit cocoa vertraut genug um zu wissen, wohin man von dort aus gehen soll.
Gedränge
4

Sie können auf Menüelemente von Anwendungen klicken, die nicht aktiv sind. Verwenden Sie diese Option, um auf den Menüpunkt zu klicken, der dem Fenster im Menü Fenster entspricht .

Folgendes müssen Sie in Ihr Skript einfügen:

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

Während das Programm nicht aktiviert wird, befindet sich das Fenster ganz vorne.

Daniel Beck
quelle
Fast! Es öffnet das Fenster über alle anderen Fenster mit Ausnahme des obersten Fensters der aktiven Anwendung. Wenn ich also einen maximierten Webbrowser habe oder so, hat dies keinen sichtbaren Effekt: /
Überfüllung
Dies löste das Problem, bei dem ich einen Fehler bekam, bei dem "AXRaise" die Aktion "Durchführen" nicht verstand ...
ttt
2

Mir ist klar, dass dieser Thread ziemlich alt ist, aber ich bin darauf gestoßen, während ich das gleiche Problem bekämpft habe, und andere können es auch. Soweit ich das beurteilen kann, ist dies nicht in rohem AppleScript möglich. Dies kann jedoch in AppleScriptObjC erfolgen. Um das Beispiel von @Daniel Beck zu verwenden, würde die neue Version so aussehen.

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

Der hinzugefügte Code verwendet die Cocoa-Klasse NSWorkspace, um die Anwendung zu "starten", wodurch nur das vorderste Fenster dieser Anwendung mit Fokus nach vorne angehoben wird. Weitere Einzelheiten zu dem Prozess, der mich dazu gebracht hat, finden Sie auf meiner Website hier ausführlicher .

Tom Scogland
quelle
0

Hier ist ein weiterer Versuch, der unter macOS High Sierra getestet wurde. Leider funktioniert dies nur, wenn sich das angegebene Fenster auf dem aktuellen Desktop befindet! Die AppleScript-API zur Steuerung von Fenstern scheint unvollständig zu sein, was dies unmöglich macht.

Ersetzen Sie Ihren Anwendungsfall durch "Safari" und "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

Dies hebt die Fenster jedoch (sichtbar) in zwei Schritten an. Das Fenster wird zuerst an den oberen Rand der Fenster der Anwendung und erst dann an den oberen Rand aller Fenster angehoben. Nicht perfekt, aber funktional.

Brecht Machiels
quelle