1. Releasing Alt cancels the {move,resize} operation and restores the original window location/size.
2. Alt+LButton raises the active window to the top of the stack
3. Alt+RButton lowers the active window to the bottom of the stack
4. The move functionality only starts after the mouse is moved a minimum threshold (10 pixels). This is to avoid accidentally moving a window when the intention is to just bring it to the top.
5. Changed the resize binding to Ctrl+Alt+button1.
I also turned off the double alt handling as I don't personally use it (I use gestures for closing windows, etc). This functionality could probably easily be added back if desired.
; Easy Window Dragging -- KDE style (requires XP/2k/NT) -- by Jonny ; http://www.autohotkey.com ; This script makes it much easier to move or resize a window: 1) Hold down ; the ALT key and LEFT-click anywhere inside a window to drag it to a new ; location; 2) Hold down ALT and RIGHT-click-drag anywhere inside a window ; to easily resize it; 3) Press ALT twice, but before releasing it the second ; time, left-click to minimize the window under the mouse cursor, right-click ; to maximize it, or middle-click to close it. ; This script was inspired by and built on many like it ; in the forum. Thanks go out to ck, thinkstorm, Chris, ; and aurelian for a job well done. ; The Double-Alt modifier is activated by pressing ; Alt twice, much like a double-click. Hold the second ; press down until you click. ; ; The shortcuts: ; Alt + Left Button : Drag to move a window. ; Ctrl+ Alt + Left Button : Drag to resize a window. ; Alt + Right Button: Lowers a window to the bottom of the stack ; Alt + Left Button: Raises a window to the top of the stack ; ; Releasing Alt after initiating a move or drag will cancel the operation. If A_AhkVersion < 1.0.25.07 { MsgBox,20,,This script may not work properly with your version of AutoHotkey. Continue? IfMsgBox,No ExitApp } ; This is the setting that runs smoothest on my ; system. Depending on your video card and cpu ; power, you may want to raise or lower this value. SetWinDelay,2 CoordMode,Mouse return ^!LButton:: If DoubleAlt { MouseGetPos,,,KDE_id ; Toggle between maximized and restored state. WinGet,KDE_Win,MinMax,ahk_id %KDE_id% If KDE_Win WinRestore,ahk_id %KDE_id% Else WinMaximize,ahk_id %KDE_id% DoubleAlt := false return } ; Get the initial mouse position and window id, and ; abort if the window is maximized. MouseGetPos,KDE_X1,KDE_Y1,KDE_id WinGet,KDE_Win,MinMax,ahk_id %KDE_id% If KDE_Win return ; Get the initial window position and size. WinGetPos,KDE_WinX1,KDE_WinY1,KDE_WinW,KDE_WinH,ahk_id %KDE_id% ; Define the window region the mouse is currently in. ; The four regions are Up and Left, Up and Right, Down and Left, Down and Right. Orig_X = %KDE_WinX1% Orig_Y = %KDE_WinY1% Orig_Width = %KDE_WinW% Orig_Height = %KDE_WinH% ;MsgBox Start %Orig_X% %Orig_Y% %Orig_Width% %Orig_Height% If (KDE_X1 < KDE_WinX1 + KDE_WinW / 2) KDE_WinLeft := true Else KDE_WinLeft := false If (KDE_Y1 < KDE_WinY1 + KDE_WinH / 2) KDE_WinUp := true Else KDE_WinUp := false Loop { GetKeyState,KDE_Button,LButton,P ; Break if button has been released. If KDE_Button = U break GetKeyState, EWD_EscapeState, LAlt, P if EWD_EscapeState = U ; Escape has been pressed, so drag is cancelled. { ;MsgBox Start %Orig_X% %Orig_Y% %Orig_Width% %Orig_Height% ;WinMove, ahk_id %KDE_id%,, %KDE_X1%, %KDE_Y1% WinMove,ahk_id %KDE_id%,,%Orig_X%,%Orig_Y%,%Orig_Width%,%Orig_Height% return } MouseGetPos,KDE_X2,KDE_Y2 ; Get the current mouse position. ; Get the current window position and size. WinGetPos,KDE_WinX1,KDE_WinY1,KDE_WinW,KDE_WinH,ahk_id %KDE_id% KDE_X2 -= KDE_X1 ; Obtain an offset from the initial mouse position. KDE_Y2 -= KDE_Y1 ; Then, act according to the defined region. If KDE_WinLeft { ; Reverse and apply the offset to the size, and correct for the skewed position. KDE_WinX1 += KDE_X2 KDE_WinW -= KDE_X2 } Else KDE_WinW += KDE_X2 ; Apply the offset to the size. If KDE_WinUp { ; Reverse and apply, correct the position. KDE_WinY1 += KDE_Y2 KDE_WinH -= KDE_Y2 } Else KDE_WinH += KDE_Y2 ; Apply the offset. ; Finally, apply all the changes to the window. WinMove,ahk_id %KDE_id%,,%KDE_WinX1%,%KDE_WinY1%,%KDE_WinW%,%KDE_WinH% KDE_X1 := (KDE_X2 + KDE_X1) ; Reset the initial position for the next iteration. KDE_Y1 := (KDE_Y2 + KDE_Y1) } return !LButton:: ;If DoubleAlt ;{ ; MouseGetPos,,,KDE_id ; ; This message is mostly equivalent to WinMinimize, ; ; but it avoids a bug with PSPad. ; PostMessage,0x112,0xf020,,,ahk_id %KDE_id% ; DoubleAlt := false ; return ;} ; Get the initial mouse position and window id, and ; abort if the window is maximized. MouseGetPos,KDE_X1,KDE_Y1,KDE_id WinGet,KDE_Win,MinMax,ahk_id %KDE_id% If KDE_Win return WinActivate,A WinSet, Top,, A ; Get the initial window position. WinGetPos,KDE_WinX1,KDE_WinY1,,,ahk_id %KDE_id% StartedMove := false StartMoveThreshold = 10 Loop { GetKeyState,KDE_Button,LButton,P ; Break if button has been released. If KDE_Button = U break GetKeyState, EWD_EscapeState, LAlt, P if EWD_EscapeState = U ; Escape has been pressed, so drag is cancelled. { WinMove, ahk_id %KDE_id%,, %KDE_WinX1%, %KDE_WinY1% return } MouseGetPos,KDE_X2,KDE_Y2 ; Get the current mouse position. KDE_X2 -= KDE_X1 ; Obtain an offset from the initial mouse position. KDE_Y2 -= KDE_Y1 If ((not StartedMove) and ((abs(KDE_X2) < StartMoveThreshold) and (abs(KDE_Y2) < StartMoveThreshold))) continue StartedMove := true KDE_WinX2 := (KDE_WinX1 + KDE_X2) ; Apply this offset to the window position. KDE_WinY2 := (KDE_WinY1 + KDE_Y2) WinMove,ahk_id %KDE_id%,,%KDE_WinX2%,%KDE_WinY2% ; Move the window to the new position. } return ; "Alt + MButton" may be simpler, but I ; like an extra measure of security for ; an operation like this. ;!MButton:: ;If DoubleAlt ;{ ; MouseGetPos,,,KDE_id ; WinClose,ahk_id %KDE_id% ; DoubleAlt := false ; return ;} ;return !RButton:: WinSet, Bottom,,A return ;; This code detects "double-clicks" of ;; the Alt key. Alt:: If toggle Send,{Alt} toggle := not toggle return ;DoubleAlt := false ; Re-initialize DoubleAlt. ;; Uncomment this line if you still want to use the Alt key to activate a program's ;; menu bar. Note that even without this enabled, menu shortcuts such as Alt+F will ;; still operate correctly: ;; Send,{Alt} ;KeyWait,Alt,D T0.6 ; ... and the next press. ;If Errorlevel ; If it never comes or takes too long, DoubleAlt remains false. ; return ;DoubleAlt := true ; Otherwise, it's true until Alt is released (activating this hotkey again). ;return