Script pour lever une seule fenêtre vers l'avant

8

Dans un script, j'essaie de trouver la fenêtre Terminal.app contenant un périphérique tty spécifique et de relever cette fenêtre vers le haut. Voici ce que j'ai dans Applescript jusqu'à présent:

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

Là où je suis coincé, c'est la partie "lever la fenêtre".

Voici quelques choses qui ne sont pas tout à fait ce que je veux:

set frontmost of theWin to true - cela amène la fenêtre à l'avant du groupe de fenêtres Terminal.app mais ne la place pas au-dessus des autres fenêtres.

tell application "Terminal" to activate- cela amène chaque fenêtre du terminal à l'avant dans une grande pile. Je veux juste une seule fenêtre.

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

Cela le fait presque, mais ce qu'il fait est de soulever la fenêtre du terminal à la position n ° 2, toujours sous la fenêtre active (si l'application active est autre chose que Terminal.app.)

click theSysWin at {10,50} - ne semble rien faire.

click first static text of theSysWin - ne semble rien faire.

Y a-t-il un moyen de faire cela? Il n'est pas nécessaire que ce soit en Applescript.

EDIT J'ai trouvé cette page Web ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) citant un appel Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Je ne suis pas familier avec ObjC ou Cocoa, et cela est (finalement) invoqué à partir d'un script shell, donc je ne sais pas où aller à partir de là.

encombrement
la source

Réponses:

5

open ne soulève qu'une seule fenêtre:

do shell script "open -a Terminal"

Une autre façon d'augmenter une fenêtre est de définir son index sur 1, puis d'utiliser 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
Lri
la source
Je veux dire, cliquer sur la fenêtre a l'effet souhaité. Je ne sais donc pas pourquoi ce serait impossible par programme. J'ai trouvé cette page Web ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) avec l'appel Obj-C / Cocoa: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); je ne connais pas assez bien objc ou cacao pour savoir où aller à partir de là cependant.
surpeuplement
4

Vous pouvez cliquer sur les éléments de menu des applications qui ne sont pas actives. Utilisez-le pour cliquer sur l'élément de menu correspondant à la fenêtre dans le menu Fenêtre .

Voici ce que vous devez insérer dans votre script:

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

Bien qu'il n'active pas le programme, la fenêtre est au premier plan.

Daniel Beck
la source
Presque! Il soulève la fenêtre au-dessus de toutes les autres fenêtres SAUF la fenêtre la plus haute de l'application active. Donc, si j'ai un navigateur Web maximisé ou quelque chose, cela n'a pas d'effet visible: /
foule
Cela a résolu le problème que je rencontrais où j'obtenais une erreur avec "AXRaise" ne comprenant pas l'action "effectuer" ...
ttt
2

Je me rends compte que ce fil est assez ancien, mais je l'ai croisé tout en luttant contre le même problème et d'autres le peuvent aussi. Pour autant que je sache, cela ne peut pas être fait en AppleScript brut. Cependant, cela peut être fait dans AppleScriptObjC. Pour utiliser l'exemple de @Daniel Beck, la nouvelle version serait comme ça.

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

Le code ajouté utilisera la classe Cocoa NSWorkspace pour "lancer" l'application, qui ne soulève que la fenêtre la plus en avant de cette application vers l'avant avec le focus. Pour plus de détails sur le processus qui m'a amené à cela, j'ai un article plus approfondi sur mon site Web ici .

Tom Scogland
la source
0

Voici une autre tentative, testée sur macOS High Sierra. Hélas, cela ne fonctionne que lorsque la fenêtre donnée est sur le bureau actuel! L'API AppleScript pour contrôler les fenêtres semble être incomplète, ce qui rend cela impossible.

Remplacez «Safari» et «WhatsApp» pour votre cas d'utilisation.

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

Cependant, cela soulève (visiblement) les fenêtres en deux étapes. Il soulève d'abord la fenêtre en haut des fenêtres de l'application, puis ne la lève qu'en haut de toutes les fenêtres. Pas parfait, mais fonctionnel.

Brecht Machiels
la source