这是之前应求帮群友写的一个脚本,或许还有其他人也用得到。
f8::
WinGetPos , x0, y0, w0, h0, A
; 要贴靠的X坐标
col := 0
; 被贴靠的窗口
ztitle := "Desktop"
; 上层窗口被覆盖区域的横坐标。x_start, x_end
arr := [a_screenwidth, 0]
; 获取所有窗口,并从上到下判断窗口边缘
winget, outputvar, list
loop %outputvar%
{
id := outputvar%a_index%
wingettitle, title, ahk_id %id%
; 跳过当前激活窗口
if(winactive("A") == id)
continue
; 跳过部分特殊窗口
else if(title == "" || title == "dummyLayeredWnd")
continue
winget, isminmax, minmax, ahk_id %id%
; 如果当前窗口最小化,跳过,查看下一个窗口
if(isminmax == -1)
continue
; 如果当前窗口最大化,跳出,不再查看后面的窗口
else if(isminmax == 1)
break
; 当前窗口工作区大小和位置
t := GetClientSize(id, w, h)
wingetpos, x, y,,, ahk_id %id%
; 当前窗口右侧x坐标
z := x + w
; 如果当前窗口右边缘被上层窗口覆盖,跳过。查看下一个窗口
if(z >= arr[1] && z <= arr[2])
continue
; 更新被覆盖区域
arr[1] := min(arr[1], x)
arr[2] := max(arr[2], z)
; 更新贴靠坐标
if(z < x0 && z > col)
{
col := z
ztitle := title
}
}
winmove, A, , %col% ,%y0%, % x0 - col + w0,% h0
return
GetClientSize(hWnd, ByRef w := "", ByRef h := "")
{
VarSetCapacity(rect, 16)
DllCall("GetClientRect", "ptr", hWnd, "ptr", &rect)
w := NumGet(rect, 8, "int")
h := NumGet(rect, 12, "int")
}