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 }
こんなの絶対だれかが作ってると思うんだけどなー。