 |
AutoHotkey Community Let's help each other out
|
| View previous topic :: View next topic |
| Author |
Message |
rodfell
Joined: 05 Oct 2007 Posts: 138 Location: Bundaberg (Bundy), Qld, Australia
|
Posted: Sun Jun 07, 2009 3:53 am Post subject: simple dual monitor window switch |
|
|
this script "throws" a window from one monitor to the other.
i know lexicos has written the excellent windowpad however my offering is a simple code snippet just for switching windows.
windows that are not minimized and will fit on both screens stay the same size. the window will stay in roughly the same relative position.
windows that are partially off screen are thrown wholly onto the other screen
windows that are to big for the screen they are being moved to are adjusted to correctly fit. they are adjusted on the x-axis, the y-axis or both
windows that fill the entire x-axis or y-axis (or both) are thrown to the other screen keeping their full state
maximized windows are thrown to the other screen in a maximized state
windows in this script are thrown using shift-m which throws the window that is under the mouse, or shift-a which throws the active window. it is much easier using a gesture program
Latest Version
| Code: | SysGet, Mon1, Monitor, 1
SysGet, Mon2, Monitor, 2
+m:: ;move window under mouse
mousegetpos,,,windowtomove
gosub windowmove
return
+a::
winget,windowtomove,id,A ;move active window
gosub windowmove
return
windowmove:
if not mon2left
return
wingetpos,x1,y1,w1,h1,ahk_id %windowtomove%
winget,winstate,minmax,ahk_id %windowtomove%
m1:=(x1+w1/2>mon1left) and (x1+w1/2<mon1right) and (y1+h1/2>mon1top) and (y1+h1/2<mon1bottom) ? 1:2 ;works out if centre of window is on monitor 1 (m1=1) or monitor 2 (m1=2)
m2:=m1=1 ? 2:1 ;m2 is the monitor the window will be moved to
ratiox:=abs(mon%m1%right-mon%m1%left)-w1<5 ? 0:abs((x1-mon%m1%left)/(abs(mon%m1%right-mon%m1%left)-w1)) ;where the window fits on x axis
ratioy:=abs(mon%m1%bottom-mon%m1%top)-h1<5 ? 0:abs((y1-mon%m1%top)/(abs(mon%m1%bottom-mon%m1%top)-h1)) ;where the window fits on y axis
x2:=mon%m2%left+ratiox*(abs(mon%m2%right-mon%m2%left)-w1) ;where the window will fit on x axis in normal situation
y2:=mon%m2%top+ratioy*(abs(mon%m2%bottom-mon%m2%top)-h1)
w2:=w1
h2:=h1 ;width and height will stay the same when moving unless reason not to lower in script
if abs(mon%m1%right-mon%m1%left)-w1<5 or abs(mon%m2%right-mon%m2%left-w1)<5 ;if x axis takes up whole axis OR won't fit on new screen
{
x2:=mon%m2%left
w2:=abs(mon%m2%right-mon%m2%left)
}
if abs(mon%m1%bottom-mon%m1%top)-h1<5 or abs(mon%m2%bottom-mon%m2%top)-h1<5
{
y2:=mon%m2%top
h2:=abs(mon%m2%bottom-mon%m2%top)
}
if winstate ;move maximized window
{
winrestore,ahk_id %windowtomove%
winmove,ahk_id %windowtomove%,,mon%m2%left,mon%m2%top
winmaximize,ahk_id %windowtomove%
}
else
{
if (x1<mon%m1%left)
x2:=mon%m2%left ;adjustments for windows that are not fully on the initial monitor (m1)
if (x1+w1>mon%m1%right)
x2:=mon%m2%right-w2
if (y1<mon%m1%top)
y2:=mon%m2%top
if (y1+h1>mon%m1%bottom)
y2:=mon%m2%bottom-h2
winmove,ahk_id %windowtomove%,,x2,y2,w2,h2 ;move non-maximized window
}
return |
Original post | Code: |
SysGet, Mon1, Monitor, 1
SysGet, Mon2, Monitor, 2
return
+z::
mousegetpos,,,windowundermouse
wingetpos,x1,y1,w1,h1,ahk_id %windowundermouse%
winget,winstate,minmax,ahk_id %windowundermouse%
m1:=(x1+w1/2>mon1left) and (x1+w1/2<mon1right) ? 1:2 ;works out if centre of window is on monitor 1 (m1=1) or monitor 2 (m1=2)
m2:=m1=1 ? 2:1 ;m2 is the monitor the window will be moved to
ratiox:=mon%m1%right-mon%m1%left-w1<5 ? 0:(x1-mon%m1%left)/(mon%m1%right-mon%m1%left-w1) ;where the window fits on x axis
ratioy:=mon%m1%bottom-mon%m1%top-h1<5 ? 0:(y1-mon%m1%top)/(mon%m1%bottom-mon%m1%top-h1) ;where the window fits on y axis
x2:=mon%m2%left+ratiox*(mon%m2%right-mon%m2%left-w1) ;where the window will fit on x axis in normal situation
y2:=mon%m2%top+ratioy*(mon%m2%bottom-mon%m2%top-h1)
w2:=w1
h2:=h1 ;width and height will stay the same when moving unless reason not to lower in script
if mon%m1%right-mon%m1%left-w1<5 or mon%m2%right-mon%m2%left-w1<5 ;if x axis takes up whole axis OR won't fit on new screen
{
x2:=mon%m2%left
w2:=mon%m2%right-mon%m2%left
}
if mon%m1%bottom-mon%m1%top-h1<5 or mon%m2%bottom-mon%m2%top-h1<5
{
y2:=mon%m2%top
h2:=mon%m2%bottom-mon%m2%top
}
if winstate ;move maximized window
{
winrestore,ahk_id %windowundermouse%
winmove,ahk_id %windowundermouse%,,mon%m2%left+ratiox*(mon%m2%right-mon%m2%left-w1),mon%m2%top+ratioy*(mon%m2%bottom-mon%m2%top-h1)
winmaximize,ahk_id %windowundermouse%
}
else
{
if (x1<mon%m1%left)
x2:=mon%m2%left ;adjustments for windows that are not fully on the initial monitor (m1)
if (x1+w1>mon%m1%right)
x2:=mon%m2%right-w2
if (y1<mon%m1%top)
y2:=mon%m2%top
if (y1+h1>mon%m1%bottom)
y2:=mon%m2%bottom-h2
winmove,ahk_id %windowundermouse%,,x2,y2,w2,h2 ;move non-maximized window
}
return |
Last edited by rodfell on Sat Jun 11, 2011 11:27 pm; edited 5 times in total |
|
| Back to top |
|
 |
Andreas129
Joined: 25 Jan 2008 Posts: 48 Location: Sweden
|
Posted: Sun Nov 29, 2009 9:13 am Post subject: |
|
|
| Thanks for sharing! Works great in Windows 7 32-bit. |
|
| Back to top |
|
 |
thankyou Guest
|
Posted: Sat Dec 05, 2009 12:46 am Post subject: |
|
|
It works perfectly in XP Pro SP3.
Thank you rodfell! |
|
| Back to top |
|
 |
james062
Joined: 05 Oct 2009 Posts: 66 Location: southampton UK
|
Posted: Sat Dec 19, 2009 11:41 pm Post subject: Thanks :-) |
|
|
WOW!!
This works great , I can now move my multimedia apps to my tv in the front room and back without seeing the app as long as your mouse pointer is in the other screen and clicked.
Thanks , Works in XP Pro and Win 7
 _________________ All`s well that ends well
I will not appreciate sarcastic or personal insults in reply s to my posts . Those are the acts of cowards being brave from afar .If you cant be productive don't be destructive . |
|
| Back to top |
|
 |
rodfell
Joined: 05 Oct 2007 Posts: 138 Location: Bundaberg (Bundy), Qld, Australia
|
Posted: Mon Jan 18, 2010 9:44 am Post subject: |
|
|
| thanks for support. |
|
| Back to top |
|
 |
Bebert62
Joined: 26 Oct 2009 Posts: 3 Location: North of France
|
Posted: Fri May 07, 2010 1:35 pm Post subject: |
|
|
I love you Rodfell !
Works on Win7 32bits |
|
| Back to top |
|
 |
bcoss Guest
|
Posted: Fri Aug 13, 2010 5:15 pm Post subject: |
|
|
I have WIN 7 - 64bit two screens mounted vertically (Windows settings configured correctly)
This script works to throw from Monitor 1 to 2, but cannot throw back to monitor 1. Is there a fix for this? |
|
| Back to top |
|
 |
rodfell
Joined: 05 Oct 2007 Posts: 138 Location: Bundaberg (Bundy), Qld, Australia
|
Posted: Sat Aug 14, 2010 3:05 pm Post subject: |
|
|
| i'll work on it. the problem/bug seems to arise when screen co-ords are negative numbers |
|
| Back to top |
|
 |
rodfell
Joined: 05 Oct 2007 Posts: 138 Location: Bundaberg (Bundy), Qld, Australia
|
Posted: Sun Aug 15, 2010 6:58 am Post subject: |
|
|
this seems to have fixed the bug. let me know if any problems | Code: | SysGet, Mon1, Monitor, 1
SysGet, Mon2, Monitor, 2
return
+z::
mousegetpos,,,windowundermouse
wingetpos,x1,y1,w1,h1,ahk_id %windowundermouse%
winget,winstate,minmax,ahk_id %windowundermouse%
m1:=(x1+w1/2>mon1left) and (x1+w1/2<mon1right) and (y1+h1/2>mon1top) and (y1+h1/2<mon1bottom) ? 1:2 ;works out if centre of window is on monitor 1 (m1=1) or monitor 2 (m1=2)
m2:=m1=1 ? 2:1 ;m2 is the monitor the window will be moved to
ratiox:=abs(mon%m1%right-mon%m1%left)-w1<5 ? 0:abs((x1-mon%m1%left)/(abs(mon%m1%right-mon%m1%left)-w1)) ;where the window fits on x axis
ratioy:=abs(mon%m1%bottom-mon%m1%top)-h1<5 ? 0:abs((y1-mon%m1%top)/(abs(mon%m1%bottom-mon%m1%top)-h1)) ;where the window fits on y axis
x2:=mon%m2%left+ratiox*(abs(mon%m2%right-mon%m2%left)-w1) ;where the window will fit on x axis in normal situation
y2:=mon%m2%top+ratioy*(abs(mon%m2%bottom-mon%m2%top)-h1)
w2:=w1
h2:=h1 ;width and height will stay the same when moving unless reason not to lower in script
if abs(mon%m1%right-mon%m1%left)-w1<5 or abs(mon%m2%right-mon%m2%left-w1)<5 ;if x axis takes up whole axis OR won't fit on new screen
{
x2:=mon%m2%left
w2:=abs(mon%m2%right-mon%m2%left)
}
if abs(mon%m1%bottom-mon%m1%top)-h1<5 or abs(mon%m2%bottom-mon%m2%top)-h1<5
{
y2:=mon%m2%top
h2:=abs(mon%m2%bottom-mon%m2%top)
}
if winstate ;move maximized window
{
winrestore,ahk_id %windowundermouse%
winmove,ahk_id %windowundermouse%,,mon%m2%left,mon%m2%top
winmaximize,ahk_id %windowundermouse%
}
else
{
if (x1<mon%m1%left)
x2:=mon%m2%left ;adjustments for windows that are not fully on the initial monitor (m1)
if (x1+w1>mon%m1%right)
x2:=mon%m2%right-w2
if (y1<mon%m1%top)
y2:=mon%m2%top
if (y1+h1>mon%m1%bottom)
y2:=mon%m2%bottom-h2
winmove,ahk_id %windowundermouse%,,x2,y2,w2,h2 ;move non-maximized window
}
return |
|
|
| Back to top |
|
 |
bcoss Guest
|
Posted: Mon Aug 16, 2010 12:23 pm Post subject: |
|
|
| That did it. Very nicely done. |
|
| Back to top |
|
 |
vahju
Joined: 17 Feb 2008 Posts: 296
|
Posted: Mon Aug 16, 2010 11:39 pm Post subject: |
|
|
I sometimes run with only 1 monitor so is there any way to place a check to only move the window if the second monitor is powered up.
I was trying to figure out where to place the IF statement and a message box but my placement of the code must be wrong.
If monitor 2 is enabled
move window
else
do nothing
Right now when I run the code with only a single monitor active it attempts to resize it on the same monitor. It works and window resizes on a single monitor just looks weird.
This is some great code. Thanks for sharing. |
|
| Back to top |
|
 |
rodfell
Joined: 05 Oct 2007 Posts: 138 Location: Bundaberg (Bundy), Qld, Australia
|
Posted: Tue Aug 17, 2010 3:02 am Post subject: |
|
|
if only 1 monitor ... | Code: | SysGet, Mon1, Monitor, 1
SysGet, Mon2, Monitor, 2
return
+z::
if not mon2left
return
mousegetpos,,,windowundermouse
wingetpos,x1,y1,w1,h1,ahk_id %windowundermouse%
winget,winstate,minmax,ahk_id %windowundermouse%
m1:=(x1+w1/2>mon1left) and (x1+w1/2<mon1right) and (y1+h1/2>mon1top) and (y1+h1/2<mon1bottom) ? 1:2 ;works out if centre of window is on monitor 1 (m1=1) or monitor 2 (m1=2)
m2:=m1=1 ? 2:1 ;m2 is the monitor the window will be moved to
ratiox:=abs(mon%m1%right-mon%m1%left)-w1<5 ? 0:abs((x1-mon%m1%left)/(abs(mon%m1%right-mon%m1%left)-w1)) ;where the window fits on x axis
ratioy:=abs(mon%m1%bottom-mon%m1%top)-h1<5 ? 0:abs((y1-mon%m1%top)/(abs(mon%m1%bottom-mon%m1%top)-h1)) ;where the window fits on y axis
x2:=mon%m2%left+ratiox*(abs(mon%m2%right-mon%m2%left)-w1) ;where the window will fit on x axis in normal situation
y2:=mon%m2%top+ratioy*(abs(mon%m2%bottom-mon%m2%top)-h1)
w2:=w1
h2:=h1 ;width and height will stay the same when moving unless reason not to lower in script
if abs(mon%m1%right-mon%m1%left)-w1<5 or abs(mon%m2%right-mon%m2%left-w1)<5 ;if x axis takes up whole axis OR won't fit on new screen
{
x2:=mon%m2%left
w2:=abs(mon%m2%right-mon%m2%left)
}
if abs(mon%m1%bottom-mon%m1%top)-h1<5 or abs(mon%m2%bottom-mon%m2%top)-h1<5
{
y2:=mon%m2%top
h2:=abs(mon%m2%bottom-mon%m2%top)
}
if winstate ;move maximized window
{
winrestore,ahk_id %windowundermouse%
winmove,ahk_id %windowundermouse%,,mon%m2%left,mon%m2%top
winmaximize,ahk_id %windowundermouse%
}
else
{
if (x1<mon%m1%left)
x2:=mon%m2%left ;adjustments for windows that are not fully on the initial monitor (m1)
if (x1+w1>mon%m1%right)
x2:=mon%m2%right-w2
if (y1<mon%m1%top)
y2:=mon%m2%top
if (y1+h1>mon%m1%bottom)
y2:=mon%m2%bottom-h2
winmove,ahk_id %windowundermouse%,,x2,y2,w2,h2 ;move non-maximized window
}
return |
|
|
| Back to top |
|
 |
rodfell
Joined: 05 Oct 2007 Posts: 138 Location: Bundaberg (Bundy), Qld, Australia
|
Posted: Tue Aug 17, 2010 10:41 am Post subject: |
|
|
added ability to throw active window (shift-a) as well as window under the mouse (shift-m). | Code: | SysGet, Mon1, Monitor, 1
SysGet, Mon2, Monitor, 2
+m::
mousegetpos,,,windowtomove
gosub windowmove
return
+a::
winget,windowtomove,id,A
gosub windowmove
return
windowmove:
if not mon2left
return
wingetpos,x1,y1,w1,h1,ahk_id %windowtomove%
winget,winstate,minmax,ahk_id %windowtomove%
m1:=(x1+w1/2>mon1left) and (x1+w1/2<mon1right) and (y1+h1/2>mon1top) and (y1+h1/2<mon1bottom) ? 1:2 ;works out if centre of window is on monitor 1 (m1=1) or monitor 2 (m1=2)
m2:=m1=1 ? 2:1 ;m2 is the monitor the window will be moved to
ratiox:=abs(mon%m1%right-mon%m1%left)-w1<5 ? 0:abs((x1-mon%m1%left)/(abs(mon%m1%right-mon%m1%left)-w1)) ;where the window fits on x axis
ratioy:=abs(mon%m1%bottom-mon%m1%top)-h1<5 ? 0:abs((y1-mon%m1%top)/(abs(mon%m1%bottom-mon%m1%top)-h1)) ;where the window fits on y axis
x2:=mon%m2%left+ratiox*(abs(mon%m2%right-mon%m2%left)-w1) ;where the window will fit on x axis in normal situation
y2:=mon%m2%top+ratioy*(abs(mon%m2%bottom-mon%m2%top)-h1)
w2:=w1
h2:=h1 ;width and height will stay the same when moving unless reason not to lower in script
if abs(mon%m1%right-mon%m1%left)-w1<5 or abs(mon%m2%right-mon%m2%left-w1)<5 ;if x axis takes up whole axis OR won't fit on new screen
{
x2:=mon%m2%left
w2:=abs(mon%m2%right-mon%m2%left)
}
if abs(mon%m1%bottom-mon%m1%top)-h1<5 or abs(mon%m2%bottom-mon%m2%top)-h1<5
{
y2:=mon%m2%top
h2:=abs(mon%m2%bottom-mon%m2%top)
}
if winstate ;move maximized window
{
winrestore,ahk_id %windowtomove%
winmove,ahk_id %windowtomove%,,mon%m2%left,mon%m2%top
winmaximize,ahk_id %windowtomove%
}
else
{
if (x1<mon%m1%left)
x2:=mon%m2%left ;adjustments for windows that are not fully on the initial monitor (m1)
if (x1+w1>mon%m1%right)
x2:=mon%m2%right-w2
if (y1<mon%m1%top)
y2:=mon%m2%top
if (y1+h1>mon%m1%bottom)
y2:=mon%m2%bottom-h2
winmove,ahk_id %windowtomove%,,x2,y2,w2,h2 ;move non-maximized window
}
return |
|
|
| Back to top |
|
 |
Guest
|
Posted: Thu Sep 09, 2010 8:32 am Post subject: |
|
|
| with using "+a" as a hotkey, I can't write "A" in Editors any more. The change to a hotkey without using shift would be better. |
|
| Back to top |
|
 |
rodfell
Joined: 05 Oct 2007 Posts: 138 Location: Bundaberg (Bundy), Qld, Australia
|
Posted: Fri Sep 10, 2010 11:16 am Post subject: |
|
|
| you can change it to whatever you want. i use mouse gestures myself. |
|
| Back to top |
|
 |
|
|
You can post new topics in this forum You can reply to topics in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|