AHK でウィンドウスナップ(吸着)

アクティブウィンドウを隣のウィンドウにくっつける関数

; ウィンドウを隣のウィンドウまで移動する
; direction = "N":上へ "W":左へ "S":下へ "E":右へ
WinClingToAnother(direction) {
	; くっつけないウィンドウクラス名(正規表現)
	exclude_class_regex := "^(Button|Shell_TrayWnd|SideBar_.+|BasicWindow)$"
	
	SysGet a, MonitorWorkArea
	WinGetPos x0, y0, w0, h0, A
	if (direction = "N") {
		x := x0
		y := 0
	} else if (direction = "S") {
		x := x0
		y := aBottom - h0
	} else if (direction = "W") {
		x := 0
		y := y0
	} else if (direction = "E") {
		x := aRight - w0
		y := y0
	}
	WinGet wids, list, , , Program Manager	; すべてのウィンドウ ID を配列 wids に取得
	loop %wids%
	{
		wid := wids%A_Index%
		WinGet state, MinMax, ahk_id %wid%
		WinGetTitle title, ahk_id %wid%
		WinGetClass class, ahk_id %wid%
		WinGetPos xn, yn, wn, hn, ahk_id %wid%
		if (state = 1) {	; 最小化されたウィンドウ
			continue
		}
		if (exclude_class_regex != "" && RegExMatch(class, exclude_class_regex)) {
			continue
		}
		if (direction = "N" && yn + hn < y0 && yn + hn > y && xn + wn > x0 && xn < x0 + w0) {
			y := yn + hn	; 下端に合わせる
		}
		if (direction = "S" && yn - h0 > y0 && yn - h0 < y && xn + wn > x0 && xn < x0 + w0) {
			y := yn - h0	; 上端に合わせる
		}
		if (direction = "W" && xn + wn < x0 && xn + wn > x && yn + hn > y0 && yn < y0 + h0) {
			x := xn + wn	; 右端に合わせる
		}
		if (direction = "E" && xn - w0 > x0 && xn - w0 < x && yn + hn > y0 && yn < y0 + h0) {
			x := xn - w0	; 左端に合わせる
		}
	}
	WinMove A, , x, y
}

こんなの絶対だれかが作ってると思うんだけどなー。