一、代码核心分析

需求是窗口固定宽度 800、横向排满一行后自动换行

1. 窗口宽度计算

2. 换行逻辑“排满再换行”

3. 第二行纵向位置(atop)计算

4. 只改位置不改大小,窗口宽度不会变成800


二、完整代码(符合“固定800宽、排满自动换行”需求)

. 版本 2
. 子程序 游戏_排列窗口
. 局部变量 apids, 整数型, , "0", 游戏进程数组
. 局部变量 gameNum, 整数型, , , 游戏数量
. 局部变量 hwnds, , , "0", 游戏窗口句柄数组
. 局部变量 hwnd, , , , 当个游戏窗口句柄
. 局部变量 i, 整数型
. 局部变量 窗口宽度, 整数型
. 局部变量 窗口高度, 整数型
. 局部变量 每行数量, 整数型
. 局部变量 列索引, 整数型
. 局部变量 行索引, 整数型
. 局部变量 行间距, 整数型

' ========== 可配置参数 ==========
窗口宽度 = 800          ' 固定窗口宽度
窗口高度 = 600          ' 对应窗口高度,根据实际游戏修改
行间距 = 5              ' 每行之间的间距,可调整
' ================================

' 没找到进程直接返回
. 如果真 (进程_取 ID 数组 (“gamefree.exe”, apids, ) = 0)
    返回 ()
. 如果真结束

gameNum = 取数组成员数 (apids)
重定义数组 (hwnds, 假, gameNum)

' 计算一行最多能放几个窗口(排满才换行)
每行数量 = 取整 (取屏幕宽度 () ÷ 窗口宽度)
. 如果真 (每行数量 < 1)  ' 屏幕太窄至少放1个
    每行数量 = 1
. 如果真结束

. 计次循环首 (gameNum, i)
    hwnds [i] = 进程_ID 取窗口句柄 (apids [i], , , , )
    hwnd = hwnds [i]

    ' 计算当前窗口在第几列、第几行(从0开始)
    列索引 = (i - 1) % 每行数量
    行索引 = (i - 1) ÷ 每行数量

    ' 延时避免操作过快
    程序_延时 (50, )

    ' 设置窗口位置和大小(固定800宽)
    窗口_置位置和大小 (hwnd, 列索引 × 窗口宽度, 行索引 × (窗口高度 + 行间距), 窗口宽度, 窗口高度)

    ' 激活窗口(保留原有逻辑)
    . 如果真 (取反 (窗口_是否激活 (hwnd)))
        窗口_置焦点 (hwnd)
        窗口_激活 (hwnd)
    . 如果真结束

    系统_处理事件 ()
. 计次循环尾 ()

三、关键说明

  1. 固定窗口尺寸:直接定义窗口宽度=800,不再动态计算,完全符合需求。
  2. 自动计算每行容量:用屏幕宽度 ÷ 窗口宽度算出一行能放多少个,真正实现“排满一行再换行”。
  3. 行列索引计算:通过取模()算列号、整除(÷)算行号,支持任意数量窗口、自动换行。
  4. 纵向位置自动累加:第二行及以后的 Y 坐标 = 行号 × (窗口高度 + 行间距),逻辑清晰,适配所有分辨率。
  5. 补全窗口尺寸参数:调用窗口_置位置和大小时传入宽度和高度,确保窗口真正变成 800 宽。
  6. 移除错误逻辑:删除了无意义的×2、错误的atop计算和平分两行的判断。

如果你的游戏窗口高度不是 600,修改代码开头的窗口高度数值即可。