PersistentWindows是目前最稳的通用方案,它绕过应用层限制,监控系统调用并全量存储窗口位置、显示器编号、DPI等参数,支持跨重启、插拔、远程重连的精准还原。

Windows 自身不保存多窗口并排布局,所谓“记住位置”仅对单个应用生效(如 VS、Directory Opus),多数程序(如 Navicat、Chrome、记事本)重启后窗口会重置。真正能跨应用、跨显示器、跨重启持久化布局的,得靠第三方工具或系统级快照机制。
Win11 的「基于监视器连接记住窗口位置」开关没用?
这个设置项(基于监视器连接记住窗口位置)只影响极少数原生 WinUI 应用(如邮件、照片),对绝大多数桌面程序无效。它不控制窗口几何信息存储逻辑,也不干预 Qt、Electron、Win32 子窗口行为。启用后你仍会看到 Chrome 窗口挤回主屏、Navicat 查询窗口消失在屏幕外——这不是设置没开,是它压根不负责这类程序。
- 该开关实际作用:仅让系统在显示器物理连接状态不变时,尝试复用上次
WINDOWPLACEMENT缓存(但很多程序主动忽略或覆盖该缓存) - 必须同步检查:Win + I → 显示器 → 标识编号是否固定;缩放比例是否一致(比如副屏 150% 而主屏 100%,Qt 程序大概率重置坐标)
- 插拔 USB-C 显示器后布局错乱?问题不在开关,而在 Windows 临时重编号显示器,导致旧坐标映射失效
Navicat / Qt 程序窗口总跑回主屏怎么办?
Navicat 基于 Qt,而 Qt 默认不调用 QSettings::setValue("geometry", window->saveGeometry()) 持久化窗口位置,尤其在多 DPI 场景下会主动归零坐标防越界。官方无设置项,勾选「自动保存」也只存 SQL 内容和连接配置。
- 唯一实测可行的伪记忆法:用 Win11 快照组(Snap Group)+ 固定任务栏
- 操作顺序必须严格:先将各窗口拖为独立窗 → Win + ←/→ 贴靠到目标显示器区域 → 悬停任务栏图标 → 点「将此组固定到任务栏」
- 下次启动 Navicat 后,右键任务栏图标 → 「恢复快照布局」,成功率约 85%,前提是显示器编号与物理排列未变
- 若失败,立刻检查:是否误启了「仅第二屏幕」模式?是否副屏被系统识别为 #1 而非 #2?
PersistentWindows 是目前最稳的通用方案
它绕过应用层限制,直接监控 SetWindowPos 和 GetWindowPlacement 系统调用,把每个窗口的 hWnd、left/top/width/height、显示器编号、DPI 缩放值全量存进 LiteDB 数据库。重启、插拔、远程重连后都能按拓扑匹配还原。
- 安装后必须以管理员权限运行,否则无法捕获任务管理器、UAC 弹窗等高权窗口
- 布局快照最多支持 36 个,用
0-9或a-z快捷键切换,无需打开 UI - 每个虚拟桌面有独立布局记录,切桌面不会串;但若用 Win + Tab 切换时拖动窗口跨桌面,需手动触发「保存当前布局」
- 数据路径固定为
C:\Users\[用户名]\AppData\Local\PersistentWindows,可备份整个文件夹实现布局迁移
Directory Opus / Visual Studio 这类能原生记住布局的例外
它们自己实现了窗口状态序列化:VS 把停靠位置写进 %LocalAppData%\Microsoft\VisualStudio\[版本]\Profiles\ 下的二进制配置;Directory Opus 用 XML 保存窗格路径、标签页、元数据面板开关等完整 UI 状态。这类记忆是应用内闭环,不依赖系统。
- VS 中保存布局:窗口 → 应用窗口布局 → 保存当前布局 → 命名(如「调试模式」)
- Directory Opus 保存:设置 → 窗口布局 → 保存所有窗口 → 勾选「保存为默认布局」才保证下次启动即加载
- 注意:VS 的布局文件不跨机器同步;Directory Opus 的布局命名不能含空格或特殊字符,否则命令行调用
dopus.exe /cmd Go LAYOUT="前端开发双栏"会失败
真正麻烦的从来不是「怎么保存」,而是「保存下来的坐标,在下次显示器物理连接状态稍有变化时,还能不能正确映射到真实像素区域」。所以别只盯着软件开关,先确保 Windows 显示器标识固定、缩放统一、物理摆放无偏移——这是所有记忆方案生效的底层前提。

















