How to Program Mouse Buttons to Maximize, Minimize, & Move Windows on Multiple Monitors

I demonstrate how I use a Logitech G700 Wireless Gaming mouse and AutoHotKey to easily maximize, minimize, and move windows around on my 5 monitor setup.


Here’s the code to easily maximize and minimize using CTRL + ALT + = (Sorry, I don’t remember exactly where I got the code from, but probably off of the forums on the main page.)

;Window Maximize or Minimize
WinGet, active_id, ID, A
WinGet, checkmax, MinMax, A
If(checkmax == 1) {
WinGet, active_id, ID, A
WinRestore, ahk_id %active_id%
} else {
WinGetClass, class, ahk_id %active_id%
If class not in ahk_class WorkerW,Shell_TrayWnd, Button, SysListView32,Progman,#32768 ;Creates

exclusion for Windows
WinMaximize, ahk_id %active_id%


This code will let you move a window by simply holding and releasing the CAPS LOCK key:

; Note: You can optionally release Capslock or the middle mouse button after
; pressing down the mouse button rather than holding it down the whole time.
; This script requires v1.0.25+.

~MButton & LButton::
CapsLock & LButton::
CoordMode, Mouse ; Switch to screen/absolute coordinates.
MouseGetPos, EWD_MouseStartX, EWD_MouseStartY, EWD_MouseWin
WinGetPos, EWD_OriginalPosX, EWD_OriginalPosY,,, ahk_id %EWD_MouseWin%
WinGet, EWD_WinState, MinMax, ahk_id %EWD_MouseWin%
if EWD_WinState = 0 ; Only if the window isn't maximized
SetTimer, EWD_WatchMouse, 10 ; Track the mouse as the user drags it.

GetKeyState, EWD_LButtonState, LButton, P
if EWD_LButtonState = U ; Button has been released, so drag is complete.
SetTimer, EWD_WatchMouse, off
GetKeyState, EWD_EscapeState, Escape, P
if EWD_EscapeState = D ; Escape has been pressed, so drag is cancelled.
SetTimer, EWD_WatchMouse, off
WinMove, ahk_id %EWD_MouseWin%,, %EWD_OriginalPosX%, %EWD_OriginalPosY%
; Otherwise, reposition the window to match the change in mouse coordinates
; caused by the user having dragged the mouse:
CoordMode, Mouse
MouseGetPos, EWD_MouseX, EWD_MouseY
WinGetPos, EWD_WinX, EWD_WinY,,, ahk_id %EWD_MouseWin%
SetWinDelay, -1 ; Makes the below move faster/smoother.
WinMove, ahk_id %EWD_MouseWin%,, EWD_WinX + EWD_MouseX - EWD_MouseStartX, EWD_WinY + EWD_MouseY - EWD_MouseStartY
EWD_MouseStartX := EWD_MouseX ; Update for the next timer-call to this subroutine.
EWD_MouseStartY := EWD_MouseY