8 votes

En utilisant applescript, comment déplacer une fenêtre vers mon deuxième écran ?

J'ai essayé toutes les options de script possibles que je peux trouver sur le Web, et quoi que je fasse, je ne peux pas déplacer une fenêtre FaceTime vers mon écran secondaire.

Ça marche...

tell application "System Events" to tell process "FaceTime"
  tell application "FaceTime" to activate
  tell front window to set position to {3600, 500}
end tell

mais avec un défaut fatal : il s'arrête toujours net, sur le bord droit de l'écran n°1 (l'écran de gauche).

Si je règle la coordonnée X sur une valeur inférieure à 2560 (ma largeur sur les deux écrans), cela fonctionne parfaitement, mais toute tentative de déplacement vers la droite, et donc sur l'écran n° 2, ne fonctionne pas.

Je ne sais pas si c'est lié, mais mon écran principal est un Dell externe, et mon écran secondaire est l'écran intégré de l'iMac 27". Dell à gauche, iMac à droite.

Cependant, il est intéressant de noter que si je fais glisser manuellement la fenêtre sur l'affichage #2 et que j'exécute le même script ci-dessus, alors elle se positionne correctement sur l'affichage #2. Il semble que les chiffres soient relatifs à l'affichage sur lequel la fenêtre se trouve ACTUELLEMENT. Comment puis-je faire en sorte que la fenêtre soit positionnée de manière absolue sur l'écran n° 2 ?

0 votes

J'essaie de vous sauver ici... bettertouchtool pour la gestion des fenêtres... n'utilisez pas applescript sauf si nécessaire.

1 votes

Merci pour l'info, mais ce besoin datait de 2012 et n'est plus d'actualité.

0 votes

Puis je poursuivrai avec une autre application facultative : Keyboard Maestro. Je ne suis pas affilié, j'aime simplement les deux applications !

3voto

benwiggy Points 21125

Il existe maintenant (à partir de Catalina ?) une commande dans le menu Fenêtre pour déplacer la fenêtre actuelle vers un autre écran.

Vous pourriez donc le faire avec des scripts GUI.

enter image description here

0 votes

Merci pour l'info, mais ce besoin datait de 2012 et n'est plus d'actualité.

0 votes

Comment le faire avec un script GUI. Et connaissez-vous un moyen de le déplacer vers 1) l'écran actif ? 2) où se trouve la souris ? 3) où se trouve le curseur ?

2voto

markhunte Points 11634

Il semble qu'Apple ait configuré la fenêtre pour qu'elle sache sur quel écran elle doit être et qu'elle ne s'étende pas en dehors des limites de cet écran lors du lancement.

Un effet secondaire de ceci est que l'application fera la même chose avec les appels de l'applescript.

Vous pouvez voir cela si vous chevauchez la fenêtre sur les deux écrans. Ensuite, quittez et relancez l'application.

La fenêtre s'ouvrira sur un seul des écrans et ne sera pas chevauchée.

Si vous faites la même chose pour Safari, par exemple. La fenêtre que vous aviez enjambée serait toujours enjambée.

Je pense que vous n'avez pas de chance de le faire de manière utile.

La seule façon de le faire était de récupérer les détails de la fenêtre et de l'affichage dans le fichier plist '~/Library/Preferences/com.apple.FaceTime' pendant que la fenêtre était sur le deuxième écran.

 (* read plist file *)
    do shell script "/usr/bin/defaults read ~/Library/Preferences/com.apple.FaceTime NSWindow\\ Frame\\ FaceTimeWindowFrame"

Ensuite, quand l'application était sur le premier écran.

Exécutez un script qui quitte l'application, réécrit l'entrée 'NSWindow Frame FaceTimeWindowFrame' dans le plist avec les infos pour la position et l'affichage que j'avais précédemment.

Activez à nouveau l'application, qui s'ouvrira sur le deuxième écran. Et ensuite le déplacer avec le code applescript normal.

tell application "FaceTime" to quit
(do shell script "/usr/bin/defaults write ~/Library/Preferences/com.apple.FaceTime NSWindow\\ Frame\\ FaceTimeWindowFrame" & (" '2562 853 638 585 2560 240 1920 1200'") as string) --set to somewhere on my second screen

delay 1
tell application "System Events"

    tell application "FaceTime" to activate

    delay 4
    set position of window "FaceTime" of application process "FaceTime" to {3269, 315}

    end tell

Mais comme je l'ai dit, ce n'est pas très utile. :-(

0 votes

WOW... c'est de la force brute, c'est vrai. Merci pour l'effort, mais vous avez raison... pas très utile. Quelle poisse choquante ! =(

2voto

joshfindit Points 431

Bien que cela ne réponde pas directement à la question de l'utilisation d'applescript, cela peut être une réponse valable pour le problème actuel du déplacement de Windows.

Vous pouvez utiliser une petite application tierce comme Ardoise .

Avec une configuration mineure, il peut être configuré pour déplacer la fenêtre par titre au lancement de Slate, lorsqu'une touche est enfoncée ou lorsqu'une condition est remplie.

Il peut également être configuré pour déplacer n'importe quelle fenêtre vers une position spécifique lorsqu'une touche est pressée ou qu'une condition est remplie.

L'ardoise peut répondre à cette demande car son encombrement est extrêmement faible et elle ne nécessite pas de privilèges d'administration.

Une bonne introduction :

http://mauriciogardini.com/post/43348489262/slate-a-mac-os-x-window-manager-for-power-users

0 votes

Une alternative très cool, merci ! Je n'avais pas l'intention d'utiliser AppleScript, c'était juste la seule approche à laquelle je pouvais penser. J'essaierai celle-ci la prochaine fois que je voudrai le faire.

1voto

Heechul Ryu Points 11

Ma solution est d'utiliser à la fois AppleScipt via Raccourcis y améthyste

et voici le script

# key codes:
# 13 w
# 14 e
on run {input, parameters}
    tell application "System Events" to key code 13 using {control down, option down, shift down}
    return input
end run
# corresponds to `Throw focused window to screen 1`

1voto

Ptujec Points 21

Voici ma solution. Elle redimensionne et positionne la fenêtre la plus en avant proportionnellement sur le deuxième écran. C'est quelques lignes de code parce qu'il prend également en compte toutes les différentes options comment vous pouvez positionner vos moniteurs dans les préférences système et autres

# http://superuser.com/questions/331313/how-to-automagically-move-windows-between-monitors-with-one-keystroke
# https://stackoverflow.com/questions/6565703/math-algorithm-fit-image-to-screen-retain-aspect-ratio
# https://forum.latenightsw.com/t/get-sizes-of-monitor-s-via-applescript/1351/10

---
use framework "Foundation"
use framework "AppKit"
use scripting additions

set allFrames to (current application's NSScreen's screens()'s valueForKey:"frame") as list
try
    set _mon1 to item 2 of item 1 of allFrames
    set _mon2 to item 2 of item 2 of allFrames

    set _mon1Width to item 1 of _mon1
    set _mon1Hight to item 2 of _mon1
    set _mon1Size to _mon1Width + _mon1Hight

    set _mon2Width to item 1 of _mon2
    set _mon2Hight to item 2 of _mon2
    set _mon2Size to _mon2Width + _mon2Hight

    set _screenWar to (_mon2Width / _mon1Width) # width adaption ratio of screen 1 & 2
    set _screenHar to (_mon2Hight / _mon1Hight) #  hight adaption ratio of screen 1 & 2 

    tell current application to set _hightoffset to do shell script "/usr/libexec/PlistBuddy -c 'Print :DisplayAnyUserSets:Configs:0:0:CurrentInfo:OriginY ' /Library/Preferences/com.apple.windowserver.displays.plist"
    set _hightoffset to _hightoffset as feet as number

    tell current application to set _widthoffset to do shell script "/usr/libexec/PlistBuddy -c 'Print :DisplayAnyUserSets:Configs:0:0:CurrentInfo:OriginX ' /Library/Preferences/com.apple.windowserver.displays.plist"
    set _widthoffset to _widthoffset as feet as number

    # detect position of the second screen in relation to the main screen
    if _mon1Width = _widthoffset then
        # say "Rechts"
        set _right to true
    else if _mon1Hight = _hightoffset then
        set _right to false
        set _bottom to true
    else if _mon2Width = -_widthoffset then
        set _right to false
        set _bottom to false
        set _left to true
    else if _mon2Hight = -_hightoffset then
        set _right to false
        set _bottom to false
        set _left to false
        set _top to true
    end if
end try

try
    tell application "System Events"
        tell (first process whose frontmost is true)
            set _windowPos to position of window 1
            set x to item 1 of _windowPos # x = position width 
            set y to item 2 of _windowPos # y = position hight 

            set _windowSize to size of window 1
            set _windowWidth to (item 1 of _windowSize)
            set _windowHight to (item 2 of _windowSize)

            # set current location (which monitor) of the frontmost window and new window size and postion 
            if _right is true then
                if x < _mon1Width then
                    set _newSize to {_windowWidth * _screenWar, _windowHight * _screenHar}
                    set _newPosition to {(x * _screenWar) + _widthoffset, ((y - 25) * _screenHar) + (_hightoffset + 25)} # menubar = 25 pixel
                    set _winLocation to "mon1"
                else
                    set _newPosition to {(x - _widthoffset) / _screenWar, ((y - (_hightoffset + 25)) / _screenHar) + 25}
                    set _newSize to {_windowWidth / _screenWar, _windowHight / _screenHar}
                    set _winLocation to "mon2"
                end if

            else if _bottom is true then
                if y < _mon1Hight then
                    set _newPosition to {(x * _screenWar) + _widthoffset, ((y - 25) * _screenHar) + (_hightoffset + 25)}
                    set _newSize to {_windowWidth * _screenWar, _windowHight * _screenHar}
                    set _winLocation to "mon1"
                else
                    set _newPosition to {(x - _widthoffset) / _screenWar, ((y - (_hightoffset + 25)) / _screenHar) + 25}
                    set _newSize to {_windowWidth / _screenWar, _windowHight / _screenHar}
                    set _winLocation to "mon2"
                end if
            else if _left is true then
                if x > -1 then
                    set _newSize to {_windowWidth * _screenWar, _windowHight * _screenHar}
                    set _newPosition to {(x * _screenWar) + _widthoffset, ((y - 25) * _screenHar) + (_hightoffset + 25)}
                    set _winLocation to "mon1"
                else
                    set _newPosition to {(x - _widthoffset) / _screenWar, ((y - (_hightoffset + 25)) / _screenHar) + 25}
                    set _newSize to {_windowWidth / _screenWar, _windowHight / _screenHar}
                    set _winLocation to "mon2"
                end if
            else if _top is true then
                if y < 25 then
                    set _newPosition to {(x - _widthoffset) / _screenWar, (y + (-_hightoffset - 25)) / _screenHar + 25}
                    set _newSize to {_windowWidth / _screenWar, (_windowHight + 25) / _screenHar - 25}
                    set _winLocation to "mon2"
                else
                    set _newSize to {_windowWidth * _screenWar, (_windowHight + 25) * _screenHar - 25}
                    set _newPosition to {(x * _screenWar) + _widthoffset, ((y - 25) * _screenHar) + _hightoffset + 25}
                    set _winLocation to "mon1"
                end if
            end if

            # checking for window loaction and whether the monitor it is located on is bigger or smaller than the other one 
            if _winLocation is "mon1" then
                if _mon1Size > _mon2Size then
                    set size of window 1 to _newSize
                    set position of window 1 to _newPosition
                else
                    set position of window 1 to _newPosition
                    set size of window 1 to _newSize
                end if

            else
                if _mon2Size > _mon1Size then
                    set size of window 1 to _newSize
                    set position of window 1 to _newPosition
                else
                    set position of window 1 to _newPosition
                    set size of window 1 to _newSize
                end if
            end if

        end tell
    end tell
end try

0 votes

Merci pour l'info, mais ce besoin datait de 2012 et n'est plus d'actualité.

3 votes

Cela ne veut pas dire que les autres ne cherchent pas de réponses à cette question ! :)

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