-
-
Save doc22940/d01d59deb396e7e380906b990e768f11 to your computer and use it in GitHub Desktop.
Advanced Window Snap is a script for AutoHotKey that expands upon Windows built-in window-snapping hotkeys.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Advanced Window Snap | |
| * Snaps the Active Window to one of nine different window positions. | |
| * | |
| * @author Andrew Moore <andrew+github@awmoore.com> | |
| * @version 1.0 | |
| */ | |
| /** | |
| * SnapActiveWindow resizes and moves (snaps) the active window to a given position. | |
| * @param {string} winPlaceVertical The vertical placement of the active window. | |
| * Expecting "bottom" or "middle", otherwise assumes | |
| * "top" placement. | |
| * @param {string} winPlaceHorizontal The horizontal placement of the active window. | |
| * Expecting "left" or "right", otherwise assumes | |
| * window should span the "full" width of the monitor. | |
| * @param {string} winSizeHeight The height of the active window in relation to | |
| * the active monitor's height. Expecting "half" size, | |
| * otherwise will resize window to a "third". | |
| */ | |
| SnapActiveWindow(winPlaceVertical, winPlaceHorizontal, winSizeHeight) { | |
| WinGet activeWin, ID, A | |
| activeMon := GetMonitorIndexFromWindow(activeWin) | |
| SysGet, MonitorWorkArea, MonitorWorkArea, %activeMon% | |
| if (winSizeHeight == "half") { | |
| height := (MonitorWorkAreaBottom - MonitorWorkAreaTop)/2 | |
| } else { | |
| height := (MonitorWorkAreaBottom - MonitorWorkAreaTop)/3 | |
| } | |
| if (winPlaceHorizontal == "left") { | |
| posX := MonitorWorkAreaLeft | |
| width := (MonitorWorkAreaRight - MonitorWorkAreaLeft)/2 | |
| } else if (winPlaceHorizontal == "right") { | |
| posX := MonitorWorkAreaLeft + (MonitorWorkAreaRight - MonitorWorkAreaLeft)/2 | |
| width := (MonitorWorkAreaRight - MonitorWorkAreaLeft)/2 | |
| } else { | |
| posX := MonitorWorkAreaLeft | |
| width := MonitorWorkAreaRight - MonitorWorkAreaLeft | |
| } | |
| if (winPlaceVertical == "bottom") { | |
| posY := MonitorWorkAreaBottom - height | |
| } else if (winPlaceVertical == "middle") { | |
| posY := MonitorWorkAreaTop + height | |
| } else { | |
| posY := MonitorWorkAreaTop | |
| } | |
| WinMove,A,,%posX%,%posY%,%width%,%height% | |
| } | |
| /** | |
| * GetMonitorIndexFromWindow retrieves the HWND (unique ID) of a given window. | |
| * @param {Uint} windowHandle | |
| * @author shinywong | |
| * @link http://www.autohotkey.com/board/topic/69464-how-to-determine-a-window-is-in-which-monitor/?p=440355 | |
| */ | |
| GetMonitorIndexFromWindow(windowHandle) { | |
| ; Starts with 1. | |
| monitorIndex := 1 | |
| VarSetCapacity(monitorInfo, 40)♣ | |
| NumPut(40, monitorInfo) | |
| if (monitorHandle := DllCall("MonitorFromWindow", "uint", windowHandle, "uint", 0x2)) | |
| && DllCall("GetMonitorInfo", "uint", monitorHandle, "uint", &monitorInfo) { | |
| monitorLeft := NumGet(monitorInfo, 4, "Int") | |
| monitorTop := NumGet(monitorInfo, 8, "Int") | |
| monitorRight := NumGet(monitorInfo, 12, "Int") | |
| monitorBottom := NumGet(monitorInfo, 16, "Int") | |
| workLeft := NumGet(monitorInfo, 20, "Int") | |
| workTop := NumGet(monitorInfo, 24, "Int") | |
| workRight := NumGet(monitorInfo, 28, "Int") | |
| workBottom := NumGet(monitorInfo, 32, "Int") | |
| isPrimary := NumGet(monitorInfo, 36, "Int") & 1 | |
| SysGet, monitorCount, MonitorCount | |
| Loop, %monitorCount% { | |
| SysGet, tempMon, Monitor, %A_Index% | |
| ; Compare location to determine the monitor index. | |
| if ((monitorLeft = tempMonLeft) and (monitorTop = tempMonTop) | |
| and (monitorRight = tempMonRight) and (monitorBottom = tempMonBottom)) { | |
| monitorIndex := A_Index | |
| break | |
| } | |
| } | |
| } | |
| return %monitorIndex% | |
| } | |
| ; Directional Arrow Hotkeys | |
| #!Up::SnapActiveWindow("top","full","half") | |
| #!Down::SnapActiveWindow("bottom","full","half") | |
| ^#!Up::SnapActiveWindow("top","full","third") | |
| ^#!Down::SnapActiveWindow("bottom","full","third") | |
| ; Numberpad Hotkeys (Landscape) | |
| #!Numpad7::SnapActiveWindow("top","left","half") | |
| #!Numpad8::SnapActiveWindow("top","full","half") | |
| #!Numpad9::SnapActiveWindow("top","right","half") | |
| #!Numpad1::SnapActiveWindow("bottom","left","half") | |
| #!Numpad2::SnapActiveWindow("bottom","full","half") | |
| #!Numpad3::SnapActiveWindow("bottom","right","half") | |
| ; Numberpad Hotkeys (Portrait) | |
| ^#!Numpad8::SnapActiveWindow("top","full","third") | |
| ^#!Numpad5::SnapActiveWindow("middle","full","third") | |
| ^#!Numpad2::SnapActiveWindow("bottom","full","third") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment