12 votes

script pour faire monter une seule fenêtre à l'avant.

Dans un script, j'essaie de trouver la fenêtre de Terminal.app contenant un périphérique tty spécifique et de faire remonter cette fenêtre au sommet. 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 bloqué, c'est la partie "lever la fenêtre".

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

set frontmost of theWin to true -- cela fait apparaître 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 fait apparaître toutes les fenêtres du terminal 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

C'est presque suffisant, mais cela a pour effet d'élever la fenêtre du terminal à la position n° 2, toujours sous la fenêtre active (si l'application active est autre que Terminal.app).

click theSysWin at {10,50} -- ne semble pas faire quoi que ce soit.

click first static text of theSysWin -- ne semble pas faire quoi que ce soit.

Y a-t-il un moyen de le faire ? 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 (en fin de compte) invoqué à partir d'un shell script, donc pas sûr de savoir où aller à partir de là.

7voto

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

do shell script "open -a Terminal"

Une autre façon d'élever une fenêtre est de mettre son index à 1 et 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

4voto

Aidan Ryan Points 5056

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 l'écran d'accueil. Fenêtre menu.

C'est 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'elle n'active pas le programme, la fenêtre est au premier plan.

3voto

Tom Scogland Points 121

Je me rends compte que ce fil de discussion est assez ancien, mais je suis tombé dessus alors que je luttais contre le même problème et d'autres peuvent le faire 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 ceci.

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, ce qui fait que seule la fenêtre la plus en avant de cette application est mise en avant avec le focus. Pour plus de détails sur le processus qui m'a amené à ce résultat, j'ai un article plus complet sur mon site web. aquí .

1voto

Brecht Machiels Points 228

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

Remplacez "Safari" et "WhatsApp" par 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

Cela permet toutefois de relever (visiblement) les fenêtres en deux étapes. Elle élève d'abord la fenêtre au sommet des fenêtres de l'application, et seulement ensuite, elle l'élève au sommet de toutes les fenêtres. Pas parfait, mais fonctionnel.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X