这段脚本通过按下 F1 实现了 将当前窗口贴靠到其左侧最近的未被遮挡窗口边缘 的功能。它通过遍历桌面上所有窗口,从上到下依次检查窗口的右边缘位置,并根据这些信息动态调整当前窗口的位置和大小。

 

F1::
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")
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。