Jump to content

Recommended Posts

Posted

Hi all,

Other commitments have taken me away from this forum but today I had an itch that I needed to scratch and AutoIt came to my rescue. I wanted a quick script to arrange windows on my screen so I wrote the one here. It's probably flawed in many ways but I'll throw it here anyways ... :D

The idea of the script is that you can use [Win]+[Ctrl]+[Numeric Keypad] to position the active window on your screen. Should be self explanatory as the window is positioned in the same place as the numeric keypad key that you use.

Opt("MustDeclareVars", 1)

Global $hDesktop = WinGetHandle("Program Manager")
Global $hDLL = DllOpen("user32.dll")
Global $gMonitorInfo = DllStructCreate("int;int[4];int[4];int;char[32]")
DllStructSetData($gMonitorInfo, 1, DllStructGetSize($gMonitorInfo))

_SetHotKeys()

While 1
    Sleep(100)
WEnd

Func _SetHotKeys()
    Local $i
    For $i = 1 To 9
        HotKeySet("#^{NUMPAD" & $i & "}", "_MoveWindow")
    Next
    HotKeySet("#^{NUMPAD0}", "_Quit")
EndFunc   ;==>_SetHotKeys

Func _MoveWindow()
    Local $hWnd = WinGetHandle("[ACTIVE]")
    If $hWnd = $hDesktop Then Return
    If WinGetTitle($hWnd) = "" Then Return
    Local $winState = WinGetState($hWnd)
    If BitAND($winState, 7) <> 7 Then Return
    If BitAND($winState, 48) <> 0 Then Return
    Local $rWindow = WinGetPos($hWnd)
    Local $hMonitor = _GetMonitorFromPoint($rWindow[0], $rWindow[1])
    If $hMonitor = 0 Then Return
    Local $rMonitor = _GetMonitorRect($hMonitor)
    Local $sKeyPressed = StringMid(@HotKeyPressed, 10, 1)
    If StringInStr("134679", $sKeyPressed) > 0 Then $rMonitor[2] /= 2
    If StringInStr("123789", $sKeyPressed) > 0 Then $rMonitor[3] /= 2
    If StringInStr("369", $sKeyPressed) > 0 Then $rMonitor[0] += $rMonitor[2]
    If StringInStr("123", $sKeyPressed) > 0 Then $rMonitor[1] += $rMonitor[3]
    WinMove($hWnd, "", $rMonitor[0], $rMonitor[1], $rMonitor[2], $rMonitor[3])
EndFunc   ;==>_MoveWindow

Func _GetMonitorFromPoint($iX, $iY)
    Local $aRet = DllCall($hDLL, "hwnd", "MonitorFromPoint", "int", $iX, "int", $iY, "int", 0)
    Return $aRet[0]
EndFunc   ;==>_GetMonitorFromPoint

Func _GetMonitorRect($hMonitor)
    Local $aRet = DllCall($hDLL, "int", "GetMonitorInfo", "hwnd", $hMonitor, "ptr", DllStructGetPtr($gMonitorInfo))
    Local $aRect[4]
    For $i = 1 To 4
        $aRect[$i - 1] = DllStructGetData($gMonitorInfo, 3, $i)
    Next
    $aRect[2] -= $aRect[0]
    $aRect[3] -= $aRect[1]
    Return $aRect
EndFunc   ;==>_GetMonitorRect

Func _Quit()
    DllClose($hDLL)
    Exit
EndFunc   ;==>_Quit

Have fun.

WBD

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...