Window Positioning Using AppleScript Using Two Monitors

I have two monitors installed, and I'm trying to place the application window on the second monitor, but nothing works. For example, I use my laptop, and the terminal window is maximized on the screen. Then I connect an external monitor. Then I want to run applescript and increase the terminal on a large second monitor.

Here is what I have right now:

set monitorTwoPos to {1050, -600} set monitorTwoSze to {1200, 1920} tell application "Microsoft Outlook" set position of window 1 to monitorTwoPos set size of window 1 to monitorTwoSze end tell 

Here is the error I get:

  /Users/vcutten/AppleScripts/SpacesWork.scpt:1291:1332: execution error: 
 Microsoft Outlook got an error: Can't make position of window 1 into type specifier.  (-1700)

I am sure that I just use the given position and set the size completely wrong :( When I used the estimates, it kind of works ...

Bonus question: How can I go through open windows and get their size? Thanks!

+6
source share
3 answers

What have you tried?

I think that for this you need to calculate the screen size and coordinates of the second monitor. For example, your primary monitor starts at position {0,0}. Therefore, the starting position of the second monitor should be something else, and you need to find it. Fortunately, I wrote a tool that will give you both the initial coordinates and the screen size of your monitors. Once you have the size and position, then it is simple. System events can set the size and position of the window so you can do something like this ...

 set monitorSize to {800, 600} set monitorPosition to {-800, 0} tell application "System Events" tell process "Terminal" set frontWindow to first window set position of frontWindow to monitorPosition set size of frontWindow to monitorSize end tell end tell 

So, from the above script, you will need size and position variables. You can get my tool here called hmscreens, which will give you this. You may need to make some adjustment of the coordinates depending on whether the screen is measured from the lower left or upper left corner, but this is just math.

I hope this helps ...

+2
source

Here is a script that handles saving and restoring size and placement for multiple display configurations. It may have problems with full-screen applications, but it seems to be working fine.

 -- allSettings is a list of records containing {width:? height:? apps:{{name:? pos:? size:?},...} -- for each display setup store the apps and their associated position and size property allSettings : {} -- create a variable for the current settings set currentSettings to {} display dialog "Restore or save window settings?" buttons {"Restore", "Save"} default button "Restore" set dialogResult to result tell application "Finder" -- use the desktop bounds to determine display config set desktopBounds to bounds of window of desktop set desktopWidth to item 3 of desktopBounds set desktopHeight to item 4 of desktopBounds set desktopResolution to desktopWidth & "x" & desktopHeight -- find the saved settings for the display config repeat with i from 1 to (count of allSettings) if (w of item i of allSettings is desktopWidth) and (h of item i of allSettings is desktopHeight) then set currentSettings to item i of allSettings end if end repeat if (count of currentSettings) is 0 then -- add the current display settings to the stored settings set currentSettings to {w:desktopWidth, h:desktopHeight, apps:{}} set end of allSettings to currentSettings --say "creating new config for " & desktopResolution else --say "found config for " & desktopResolution end if end tell tell application "System Events" if (button returned of dialogResult is "Save") then say "saving" repeat with p in every process if background only of p is false then tell application "System Events" to tell application process (name of p as string) set appName to name of p if (count of windows) > 0 then set appSize to size of window 1 set appPosition to position of window 1 else set appSize to 0 set appPosition to 0 end if set appSettings to {} repeat with i from 1 to (count of apps of currentSettings) if name of item i of apps of currentSettings is name of p then set appSettings to item i of apps of currentSettings end if end repeat if (count of appSettings) is 0 then set appSettings to {name:appName, position:appPosition, size:appSize} set end of apps of currentSettings to appSettings else set position of appSettings to appPosition set size of appSettings to appSize end if end tell end if end repeat end if if (button returned of dialogResult is "Restore") then if (count of apps of currentSettings) is 0 then say "no window settings were found" else say "restoring" repeat with i from 1 to (count of apps of currentSettings) set appSettings to item i of apps of currentSettings set appName to (name of appSettings as string) try tell application "System Events" to tell application process appName if (count of windows) > 0 then set position of window 1 to position of appSettings set size of window 1 to size of appSettings end if end tell end try end repeat end if end if end tell 

https://gist.github.com/cmackay/5863257

+1
source

Use borders instead of position; it works. You can get the borders of the window as follows:

 tell application "Microsoft Outlook" get bounds of first window end tell 

Answer the question about the bonus:

 tell application "Microsoft Outlook" repeat with nextWindow in (get every window) get bounds of nextWindow end repeat end tell 

If you open the Answers tab at the bottom of the Applescript editor, you'll see that everyone gets the results.

Hope this helps.

0
source

Source: https://habr.com/ru/post/887167/


All Articles