'script configuration:
'the coordinates of each monitor, either of the full screen area or parts of it, need to be specified, ordered from left to right.
'to take taskbars and desktop toolbars into account when maximizing or moving a window, specify the workspace coordinates instead of
'the screen coordinates. both types of coordinates are shown for each monitor under UltraMon menu > About
'
'sample script configuration:
'two monitors at 1024x768, the first monitor is split in a left and right half, the second monitor isn't split:
'MONITORS = Array("0,0,512,768","512,0,1024,768","1024,0,2048,768")
'
'optional command-line arguments for the script:
'
'/m: maximize window after moving it
'/n: move window to next monitor (default)
'/p: move window to previous monitor
'/r: only resize window if necessary (resize to fit). default is resize proportionally

Option Explicit
Dim MONITORS
MONITORS = Array()

If UBound(MONITORS) = -1 Then
	MsgBox "You'll need to configure the script before using it for the first time. To do this, right-click the script and select Edit from the menu, then read the instructions at the top of the script.",, "VMonMoveWnd3"
	WScript.Quit
End If

Const SHOWSTATE_NORMAL = 2
Const POS_LEFT = 0
Const POS_TOP = 1
Const POS_RIGHT = 2
Const POS_BOTTOM = 3

Dim moveNext, resizeToFit, args, maximize
moveNext = True
resizeToFit = False
maximize = False
Set args = WScript.Arguments
For i = 0 To args.Count - 1
	Select Case args(i)
		Case "/m"
			maximize = True
		Case "/n"
			moveNext = True
		Case "/p"
			moveNext = False
		Case "/r"
			resizeToFit = True
	End Select
Next

Dim wnd
Set wnd = CreateObject("UltraMon.Window")
If wnd.GetForegroundWindow() = True Then
	Dim wndLeft, wndRight, wndTop, wndBottom, wndWidth, wndHeight
	wndLeft = wnd.Left
	wndTop = wnd.Top
	wndWidth = wnd.Width
	wndHeight = wnd.Height
	wndRight = wnd.Left + wndWidth
	wndBottom = wnd.Top + wndHeight
	
	'msgbox "wnd: " & wndLeft & "," & wndTop & " - " & wndRight & "," & wndBottom
		
	Dim i, str, rect, intLeft, intTop, intRight, intBottom, area, maxArea, maxAreaMonIndex
	maxAreaMonIndex = -1
	For i = 0 To UBound(MONITORS)
		str = Split(MONITORS(i), ",")
		rect = Array(CLng(str(0)), CLng(str(1)), CLng(str(2)), CLng(str(3)))
		If Not (wndRight <= rect(POS_LEFT) Or wndLeft >= rect(POS_RIGHT) Or wndTop >= rect(POS_BOTTOM) Or wndBottom <= rect(POS_TOP)) Then
			intLeft = wndLeft
			If intLeft < rect(POS_LEFT) Then intLeft = rect(POS_LEFT)
			intTop = wndTop
			If intTop < rect(POS_TOP) Then intTop = rect(POS_TOP)
			intRight = wndRight
			If intRight > rect(POS_RIGHT) Then intRight = rect(POS_RIGHT)
			intBottom = wndBottom
			If intBottom > rect(POS_BOTTOM) Then intBottom = rect(POS_BOTTOM)
			
			area = (intRight - intLeft) * (intBottom - intTop)
			If area > maxArea Then
				maxArea = area
				maxAreaMonIndex = i
			End If
			
			'msgbox "mon: " & MONITORS(i) & " int: " & intLeft & "," & intTop & " - " & intRight & "," & intBottom & " area: " & area
		End If
	Next
	
	If maxAreaMonIndex <> -1 Then MoveWindow wnd, maxAreaMonIndex, moveNext, resizeToFit, maximize
End If

Sub MoveWindow(wnd, curMonIndex, moveNext, resizeToFit, maximize)
	Dim curLeft, curTop, curWidth, curHeight, curMonLeft, curMonTop, curMonWidth, curMonHeight
	Dim newMonIndex, newMonLeft, newMonTop, newMonWidth, newMonHeight
	
	curLeft = wnd.Left
	curTop = wnd.Top
	curWidth = wnd.Width
	curHeight = wnd.Height
	
	str = Split(MONITORS(curMonIndex), ",")
	rect = Array(CLng(str(0)), CLng(str(1)), CLng(str(2)), CLng(str(3)))
	curMonLeft = rect(POS_LEFT)
	curMonTop = rect(POS_TOP)
	curMonWidth = rect(POS_RIGHT) - rect(POS_LEFT)
	curMonHeight = rect(POS_BOTTOM) - rect(POS_TOP)
	
	newMonIndex = curMonIndex
	newMonLeft = 0
	newMonTop = 0
	newMonWidth = 0
	newMonHeight = 0
	
	If moveNext Then
		newMonIndex = newMonIndex + 1
		If newMonIndex > UBound(MONITORS) Then newMonIndex = 0
	Else
		newMonIndex = newMonIndex - 1
		If newMonIndex < 0 Then newMonIndex = UBound(MONITORS)
	End If
	
	str = Split(MONITORS(newMonIndex), ",")
	rect = Array(CLng(str(0)), CLng(str(1)), CLng(str(2)), CLng(str(3)))
	newMonLeft = rect(POS_LEFT)
	newMonTop = rect(POS_TOP)
	newMonWidth = rect(POS_RIGHT) - rect(POS_LEFT)
	newMonHeight = rect(POS_BOTTOM) - rect(POS_TOP)
	
	If newMonWidth <> 0 Then
		Dim newLeft, newTop, newWidth, newHeight, offsetX, offsetY, offsetXRel, offsetYRel
		Dim newOffsetX, newOffsetY, relWidth, relHeight
		
		If maximize = True Then
			newLeft = newMonLeft
			newTop = newMonTop
			newWidth = newMonWidth
			newHeight = newMonHeight
		Else
			offsetX = curLeft - curMonLeft
			offsetY = curTop - curMonTop
			
			If newMonWidth = curMonWidth And newMonHeight = curMonHeight Then
				newLeft = newMonLeft + offsetX
				newTop = newMonTop + offsetY
				newWidth = curWidth
				newHeight = curHeight
			Else
				If resizeToFit = True Then
					offsetXRel = offsetX / curMonWidth
					offsetYRel = offsetY / curMonHeight
					newOffsetX = newMonWidth * offsetXRel
					newOffsetY = newMonHeight * offsetYRel
					
					newWidth = curWidth
					If newWidth > newMonWidth Then newWidth = newMonWidth
					newHeight = curHeight
					If newHeight > newMonHeight Then newHeight = newMonHeight
					
					If newOffsetX + newWidth > newMonWidth Then newOffsetX = newMonWidth - newWidth
					If newOffsetY + newHeight > newMonHeight Then newOffsetY = newMonHeight - newHeight
					
					newLeft = newMonLeft + newOffsetX
					newTop = newMonTop + newOffsetY
				Else
					offsetXRel = offsetX / curMonWidth
					offsetYRel = offsetY / curMonHeight
					relWidth = curWidth / curMonWidth
					relHeight = curHeight / curMonHeight
					newLeft = newMonLeft + newMonWidth * offsetXRel
					newTop = newMonTop + newMonHeight * offsetYRel
					newWidth = newMonWidth * relWidth
					newHeight = newMonHeight * relHeight
					
					'MsgBox "newWnd: " & newWidth & "x" & newHeight & " @ " & newLeft & "," & newTop
				End If
			End If
		End If
		
		wnd.ShowState = SHOWSTATE_NORMAL
		wnd.Left = newLeft
		wnd.Top = newTop
		wnd.Width = newWidth
		wnd.Height = newHeight
		wnd.ApplyChanges 0
	End If
End Sub