自动窗口大小

自动窗口大小

使用可配置尺寸、最小锁定和自动全屏自动调整Minecraft游戏窗口大小。Forge 1.20.1模组。

Bug修复

Auto Window Size

Minecraft Forge 1.20.1 客户端模组 | 自动窗口尺寸、居中与最小尺寸锁定


目录


目的

在制作整合包时,我经常遇到这个问题:精心调整了各种模组的 UI 布局后,玩家以不同的分辨率启动游戏,窗口尺寸发生变化,所有 UI 布局都被打乱了。

为了解决这个问题,我制作了这个模组:它在启动时自动将窗口设置为指定尺寸并居中,同时锁定最小窗口尺寸——确保整合包的 UI 布局在不同玩家的电脑上保持一致。


功能

  • 启动时自动设置窗口尺寸:自动将游戏窗口调整为配置的分辨率,并在当前显示器上居中
  • 最小尺寸锁定:锁定时,窗口只能放大,不能缩小到配置尺寸以下——保护 UI 布局
  • 原生视频设置入口:在 选项 → 视频设置 中原生插入了一个“窗口设置”按钮,位于“全屏分辨率”正下方,可随列表正常滚动和缩放
  • 窗口设置界面:一个专用的设置界面,包含手动锁定开关,并实时显示屏幕分辨率和游戏窗口分辨率
  • 自定义快捷键切换:在控制设置中绑定按键以快速切换锁定状态(默认:未绑定)
  • 低分辨率时自动禁用:当配置的或硬编码的最小分辨率超过玩家的屏幕分辨率时,自动禁用锁定并保持窗口不变,以避免显示错误
  • 退出全屏时恢复:从全屏切换回窗口模式时,自动恢复配置的窗口尺寸和位置
  • 进入世界时状态通知:每次进入世界时,聊天栏显示当前锁定状态(已锁定 / 已解锁 / 已禁用)
  • 实时分辨率显示:窗口设置界面实时显示当前屏幕分辨率和游戏窗口分辨率,停止拖动窗口 1 秒后自动刷新
  • 多显示器支持:自动检测游戏窗口所在的显示器,并据此居中

分辨率优先级

窗口尺寸遵循以下优先级(从高到低):

硬编码最小值(1024×576)
        ↓
配置文件值(默认 1280×720,可配置)
        ↓
玩家手动拖动(仅在锁定禁用时)
优先级 来源 默认值 说明
1(最高) 代码中硬编码 1024×576 硬编码最小分辨率,16:9 宽高比,永远不会低于此值
2 配置文件 1280×720 在 config/autowindowsize-client.toml 中修改,启动时读取
3(最低) 玩家拖动 — 仅在关闭锁定时生效;玩家可自由拖动窗口边缘

注意:启用锁定时,窗口的最小尺寸 = 配置值(但不低于硬编码最小值)。如果配置值低于 1024×576,则实际最小尺寸为 1024×576。


锁定机制

锁定开启时

  • 窗口的最小尺寸锁定为配置值(不低于 1024×576)
  • 窗口可以放大,无上限
  • 窗口无法缩小到锁定尺寸以下
  • 退出全屏时,窗口恢复为配置尺寸并居中,并重新应用最小尺寸限制

锁定关闭时

  • 窗口尺寸完全自由,可任意放大或缩小
  • 退出全屏时,窗口恢复为配置尺寸并居中,但不设置最小尺寸限制
  • 玩家可通过 UI 按钮或自定义快捷键重新启用锁定

锁定禁用时

  • 锁定功能完全不可用,按钮置灰且无法点击
  • 窗口尺寸不改变,保持玩家原有的尺寸
  • 退出全屏时,窗口尺寸不改变
  • 按下自定义快捷键时,聊天栏显示消息:“分辨率过低,锁定功能已禁用”
  • 进入世界时,聊天栏显示禁用原因

低分辨率检测

触发条件

当满足以下任意条件时,自动禁用锁定:

配置宽度 > 当前屏幕宽度
配置高度 > 当前屏幕高度
硬编码最小宽度(1024) > 当前屏幕宽度
硬编码最小高度(576) > 当前屏幕高度

触发后的行为

  1. 窗口尺寸不变:保持玩家启动前的窗口尺寸,不强制设为配置值
  2. 无最小尺寸限制:不调用 GLFW 的窗口尺寸限制
  3. 锁定自动关闭:lockEnabled = false
  4. 标记为已禁用:lockDisabled = true
  5. 进入世界时聊天通知:红色文字说明禁用原因
  6. 窗口设置中按钮置灰:显示“锁定已禁用(分辨率过低)”,无法点击
  7. 按键时再次通知:按下切换锁定键时,聊天栏再次显示分辨率过低

如何恢复

将配置文件中的分辨率修改为小于或等于屏幕分辨率,然后重启游戏。

注意:检测在游戏启动时运行一次。运行期间更改屏幕分辨率不会重新触发检测。


退出全屏行为

从全屏切换回窗口模式(F11)时,模组的行为取决于当前锁定状态:

锁定状态 行为
锁定开启 恢复配置窗口尺寸并居中,重新应用最小尺寸限制
锁定关闭 恢复配置窗口尺寸并居中,不设置最小尺寸限制
锁定禁用 不改变窗口尺寸,保持退出全屏后的尺寸

游戏内状态通知

每次从主菜单或加载界面进入世界时,聊天栏显示一次当前锁定状态:

状态 消息 颜色
锁定开启 [AutoWindowSize] 最小窗口已锁定 绿色
锁定关闭 [AutoWindowSize] 窗口尺寸已解锁,可自由调整大小 灰色
锁定禁用 [AutoWindowSize] 配置或最小分辨率超过屏幕分辨率,窗口锁定已自动禁用,窗口尺寸不变 红色
  • 每次进入世界仅显示一次
  • 返回主菜单并再次进入世界后,会再次显示
  • 通知显示在聊天栏中,而非标题/副标题

窗口设置界面

如何打开

  1. 主菜单:选项... → 视频设置... → 点击 窗口设置 按钮
  2. 游戏内:Esc → 选项... → 视频设置... → 点击 窗口设置 按钮

“窗口设置”按钮原生插入到视频设置列表中“全屏分辨率”行的正下方,可随列表和 GUI 缩放正常滚动和缩放。

界面内容

元素 说明
屏幕分辨率 当前主显示器分辨率(例如 1920 × 1080),白色文字
游戏分辨率 当前游戏窗口帧缓冲像素尺寸(例如 1280 × 720),浅绿色文字
窗口锁定按钮 点击切换锁定开/关;锁定时置灰且无法点击
完成按钮 返回视频设置界面

实时刷新机制

  • 打开界面时,读取一次当前窗口分辨率
  • 拖动窗口边缘调整大小时,界面显示橙色提示:“窗口尺寸变化中,松开后 1 秒自动刷新……”
  • 停止拖动 1 秒后,“游戏分辨率”值自动更新
  • 延迟刷新可避免拖动期间频繁重绘文字导致卡顿

安装

  1. 确保已安装 Minecraft 1.20.1 和 Forge 47.x
  2. 将模组 jar 文件放入 .minecraft/mods 文件夹
  3. 启动游戏

这是一个客户端模组,无需安装在服务器上。


配置

文件路径

.minecraft/config/autowindowsize-client.toml

配置选项

[window]
    # 启动窗口宽度,也是锁定时的最小宽度
    # 范围:1 ~ 7680
    # 默认:1280
    width = 1280

    # 启动窗口高度,也是锁定时的最小高度
    # 范围:1 ~ 4320
    # 默认:720
    height = 720

注意事项

  • 配置值在游戏启动时读取;运行期间修改配置文件需重启后生效
  • 如果配置值低于硬编码最小值(1024×576),实际最小锁定尺寸仍为 1024×576
  • 如果配置值高于屏幕分辨率,锁定会自动禁用,窗口尺寸不变

按键绑定

默认状态

未绑定。模组不占用任何按键;玩家需在控制设置中自行绑定。

如何绑定

  1. 选项... → 控制...
  2. 搜索“Auto Window Size”或滚动找到“Auto Window Size”分类
  3. 点击“切换窗口尺寸锁定”
  4. 按下想要绑定的按键(可以是键盘按键或鼠标按钮)
  5. 点击“完成”保存

使用方法

  • 游戏内(世界中)按下绑定的按键以切换锁定开/关
  • 聊天栏显示切换后的状态
  • 锁定禁用时,按下按键不会切换状态,而是显示分辨率过低

多显示器支持

  • 启动时,模组自动检测游戏窗口当前所在的显示器(基于窗口中心点)
  • 窗口在该显示器上居中,而非始终在主显示器上
  • 将窗口拖过屏幕时(窗口中心位于两个显示器之间),默认使用主显示器
  • 获取当前显示器分辨率时,也使用窗口所在显示器的分辨率,而非主显示器

技术信息

项目 值
Minecraft 版本 1.20.1
Forge 版本 47.x
模组 ID autowindowsize
模组类型 客户端
硬编码最小分辨率 1024×576(16:9)
默认配置分辨率 1280×720
许可证 MIT
语言 Java

常见问题

问:为什么我编辑了配置分辨率后窗口没有变化? 答:如果配置的分辨率高于屏幕分辨率,模组会自动禁用锁定并保持窗口不变。请将配置值设为小于或等于屏幕分辨率,然后重启游戏。

问:锁定时还能放大窗口吗? 答:可以。锁定仅限制最小尺寸,不限制最大尺寸——你可以自由放大窗口。

问:如何绑定自定义快捷键来切换锁定? 答:选项... → 控制... → 搜索“Auto Window Size” → 点击“切换窗口尺寸锁定” → 按下想要的按键。默认为未绑定。

问:支持多显示器配置吗? 答:支持。模组自动检测游戏窗口所在的显示器,并据此居中。

问:为什么窗口设置界面中的游戏分辨率不是实时更新的? 答:为避免拖动窗口时频繁重绘文字导致卡顿,模组在你停止拖动 1 秒后更新数值。拖动时会显示橙色提示。

问:锁定被禁用了,如何恢复? 答:将配置文件中的分辨率修改为小于或等于屏幕分辨率,然后重启游戏。锁定禁用仅在启动时检测,运行期间不会自动恢复。

问:这个模组需要安装在服务器上吗? 答:不需要。这是一个纯客户端模组,仅影响客户端的窗口尺寸;服务器无需安装。

问:会与其他模组冲突吗? 答:本模组仅修改游戏窗口的尺寸和最小尺寸限制,不修改任何游戏内机制,因此一般不会与其他模组冲突。如果与其他修改窗口尺寸的模组同时使用,可能会出现冲突。


致谢

感谢所有使用本模组的玩家和整合包作者。 欢迎通过 Issues 提供反馈和建议。