跳到主内容

窗口布局快照 - 免费把窗口位置存成一份快照,乱掉点一下就摆回去(其它工具)

免费下载窗口布局快照 v1.0.0
平台:Windows 7 / 10 / 11(32/64 位均可)大小:28 KB版本:v1.0.0更新:2026-10-25
提取码:aa2v(如提示需要,请输入)
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境,不联网、不上传数据。
笔记本外接显示器,休眠、解锁、拔插 HDMI 之后所有窗口被挤到一块屏上堆叠,每次都要一个个重新拖

窗口布局快照 运行界面

软件名称窗口布局快照
版本v1.0.0
授权免费(可自由使用与转发)
运行方式本地运行,不上传数据
所属分类其它工具

这个工具解决什么问题

用笔记本办公的人几乎都遇到过这件事:白天接显示器,左边写文档右边看资料,窗口摆得整整齐齐;下班合盖带走,第二天到公司插上线,屏幕一亮——所有窗口都跑到了主屏左上角,一层压一层,只剩下最前面那个还能看见。拔插 HDMI 也一样,有时是副屏上的窗口被搬到主屏,有时是整个布局被压成一小块。Windows 自己不会记住这些位置,重启资源管理器、切换分辨率、更新显卡驱动都可能让布局重来一遍。要恢复,只能一个个从任务栏点出来、拖到该在的位置、再调整大小。窗口少的时候花两分钟,开着浏览器十几个标签、几个资源管理器窗口的时候,十分钟就没了。这个工具把这件事变成两个动作:摆好的时候存一份快照,乱掉之后点一下还原。

  • 原来的做法:从任务栏把每个窗口点出来,先拖到大致位置,再拉边框调整大小;遇上副屏拔掉的情况,还得先把跑到屏幕外的窗口用「窗口 + 方向键」挪回来,再继续摆
  • 用这个工具:窗口摆好时点「保存为新快照」记录一次;以后布局乱了,选中快照点「还原」,程序按进程路径与标题把每个窗口认出来,一次性摆回原来的位置与大小,已经关掉的窗口自动跳过
  • 省下来的:一次还原十几个窗口,从十分钟的手工拖拽变成点两下;换显示器、拔掉副屏后也不会出现「窗口跑到屏幕外面找不回来」的情况

技术实现

整件事拆成四层,互相之间只通过普通数据结构传递,所以位置算错、匹配配错这类问题都能脱离界面用断言测出来:枚举层(WindowModel)只负责「现在屏幕上有哪些窗口」并做过滤;模型层(Snapshot)负责快照的数据结构、几何约束与配对算法;执行层(Restorer)只做「把哪个句柄摆到哪个矩形」;界面层(MainForm)只做交互。窗口位置本身不是简单的 GetWindowRect——最小化时它返回的是 -32000 附近的假坐标,最大化时返回的又是铺满工作区之后的尺寸,两种情况都得改用 GetWindowPlacement 里的 rcNormalPosition 才是用户直觉中的「它原来在哪」。还原时还要再算一次边界:快照是在双屏下存的,在只有一块屏的地方还原,必须把落在屏幕外的窗口收进可见区域,否则用户看到的现象是「点了还原,窗口全不见了」。

  • EnumWindows 之后做四层过滤,避免搬动不该搬的窗口:依次排除:IsWindowVisible 为假的隐形窗口、扩展样式带 WS_EX_TOOLWINDOW 的工具窗口(输入法候选框、托盘提示)、DwmGetWindowAttribute 的 DWMWA_CLOAKED 为真的 UWP 残留壳窗口、以及类名为 Progman / WorkerW / Shell_TrayWnd 的桌面与任务栏窗口。最后一层按类名而不是标题判断,因为标题会随系统语言变化。
  • 最小化与最大化都从 WINDOWPLACEMENT.rcNormalPosition 取位置:窗口最小化时 GetWindowRect 返回 (-32000, -32000) 附近的哨兵值,直接记下来再还原,窗口会跑到一个谁也够不着的地方;最大化时返回的是铺满工作区的尺寸,记下来会让「取消最大化」变成一块铺满屏幕的怪东西。两种情况统一取 rcNormalPosition,也就是「还原状态下它在哪、多大」。
  • 窗口配对用打分 + 全局贪心,而不是按顺序或只按标题:两次保存之间枚举顺序和窗口数量都会变,标题也会变(切标签页、改文件名都会改标题)。打分规则:同进程且可执行文件完整路径相同记 120 分(chrome 的十几个窗口靠这条区分)、仅进程名相同记 40 分(路径取不到时兜底)、标题完全相同再加 50 分、标题互相包含加 15 分;不同进程直接判 0 分不予配对。候选配对按分数从高到低分配,一个窗口只用一次。
  • 还原前按当前工作区做一次几何约束,处理「副屏已被拔掉」:取 Screen.AllScreens 的工作区(已扣掉任务栏)作为边界:先找与目标矩形相交面积最大的那块屏;如果完全不相交,说明那块屏没了,搬到中心点最近的一块屏并留出偏移;窗口比屏幕还大时缩到工作区内;最后保证标题栏至少露出 160×40 像素可抓。这一步是「换环境后还能用」的关键。
  • 摆位置只用 SetWindowPos,且带 SWP_NOZORDER | SWP_NOACTIVATE:不加 NOACTIVATE 的话,还原 10 个窗口会抢 10 次焦点,屏幕上闪 10 下,用户当前正在敲的那一行也会丢。不加 NOZORDER 则会打乱前后遮挡关系。摆完立刻用 GetWindowRect 复核一次(容差 4px),确认位置真的变了才算成功——有些自绘窗口会自己再挪回去,这种情况必须如实报告而不是假装成功。
  • DPI 感知 + 尺寸自乘系数、字号不乘系数:启动时调 SetProcessDPIAware(),让 GetWindowRect 拿到屏幕真实像素,坐标体系才不会和系统虚拟化后的值错位。代价是界面要自己缩放:控件尺寸乘 GetDeviceCaps(LOGPIXELSX)/96,但字号不能乘——Font 的点值本身就已经按系统 DPI 换算了,再乘一次会让 175% 缩放的机器上字变成三倍大、按钮文字被切掉。
  • 快照存成本机 JSON 文件,写完立刻读回校验:位置在 %APPDATA%\窗口布局快照\snapshots\,一个快照一个 .json,文件名取快照名。用「一文件一快照」是为了删改单个快照时不会连带损坏别的。文件是 UTF-8 且中文不转义,出问题可以直接用记事本打开看。保存后立即读回一次比对条数,坏文件不会留在盘上。

技术栈:C# 5.0、.NET Framework 4.8(系统自带,无需安装运行时)、WinForms 窗体、Win32 API(EnumWindows / GetWindowPlacement / SetWindowPos)、自写 JSON 读写(不引用 System.Web.Extensions)

已知局限:以管理员权限运行的窗口(如任务管理器、部分系统设置页)摆不动,程序会在结果里如实列出,不会反复重试。已经最大化的窗口只改它「还原后」的尺寸,不会擅自取消最大化。虚拟桌面里其它桌面上的窗口枚举不到,只处理当前桌面。多显示器不同缩放比例(例如笔记本 150% + 外接 100%)时,坐标以主屏 DPI 折算,可能有几个像素偏差。

同类软件对照

下面几款都是公开可查的同类软件,定位各不相同。这里只说明各自的定位,以及本工具在其中的位置,方便你判断哪一类更契合自己的用法。

软件它的定位本工具的定位
PowerToys FancyZones微软 PowerToys 套件里的窗口分区功能,把屏幕划成固定网格,拖入窗口时自动对齐到分区FancyZones 管的是「窗口该待在哪个格子」,偏事前约束;本工具管的是「窗口原来在哪」,偏事后恢复,不做分区、不改变拖拽行为
DisplayFusion多显示器增强套件,包含标题栏按钮、壁纸管理、显示器配置切换、窗口位置配置文件等一整组功能本工具只做「存位置 / 摆回去」这一件事,单个 exe、不常驻、不接管窗口,界面就是一个窗口列表加几个按钮
WindowManager(desksoft)面向窗口位置管理的桌面工具,可保存与恢复窗口位置,同时也能处理桌面图标位置的保存与恢复本工具在还原前会按当前真实存在的屏幕重新约束坐标,专门处理「副屏被拔掉」这种跨环境的情况;功能范围只限窗口位置,不碰桌面图标
Windows 11 显示设置里的「根据显示器连接情况记住窗口位置」系统自带的开关项,由 Windows 在显示器连接情况变化时按自己的策略恢复窗口位置系统开关不让你指定「记哪一套布局」,也不提供多份布局与手动还原;本工具可以按场景存多份快照,随时手动还原任意一份

以上仅作定位对照,各软件的可用性、授权方式与功能范围请以其官方页面为准。

操作教程

  1. 解压后双击「窗口布局快照.exe」
    不需要安装 .NET 运行时或任何其它组件,直接打开一个窗口。左边是当前屏幕上所有窗口的实时列表,右边是快照内容。
    预期结果:窗口打开,左侧列出当前桌面的窗口(程序名 / 标题 / 位置),顶部「快照」下拉框为空
  2. 按你习惯的样子把窗口摆好
    这一步用 Windows 自己的方式拖就行,工具不参与。左边列表只做展示,不会去动任何窗口。摆好后点右上角的「刷新列表」,确认列表里的位置和你看到的一致。
    预期结果:左侧列表里每个窗口的「位置」与实际一致
  3. 点「保存为新快照」,起个名字
    名字按场景起最实用,例如「公司双屏」「家里单屏」「笔记本外出」。同一个布局可以存多份,下拉框里按保存时间倒序排列。
    预期结果:提示「已保存『公司双屏』:N 个窗口」,右侧列表出现同样的条目,状态列显示「已打开」
  4. 等窗口乱掉之后,选中那份快照
    典型触发场景:合盖休眠再打开、拔插 HDMI、切换分辨率、解锁后窗口挤成一堆。程序每 2 秒比对一次显示器配置,一旦发现变化,底部会提示「检测到显示器配置已变化」。
    预期结果:底部出现蓝色提示,右侧列表里已关闭的窗口显示为灰色「未打开」
  5. 点「还原」,确认后窗口自动归位
    确认框会先告诉你「将把 N 个窗口按某某快照摆放」。还原过程不抢焦点、不改前后遮挡关系,你正在编辑的窗口不会被切走。
    预期结果:窗口按快照里的位置与大小摆好,底部状态栏显示「快照 N 个窗口,找到 M 个,已摆放 X 个」
  6. 换了环境(比如副屏没带)时,确认「自动收进可见区域」是勾上的
    这个选项默认开启。它保证快照里记在副屏上的窗口,在只有一块屏时被收进当前屏幕,而不是留在屏幕外面。窗口比屏幕还大时会等比缩到放得下。
    预期结果:原本在副屏上的窗口出现在主屏,标题栏可见、能拖动

常见问题

Q:点了还原,但有几个窗口没动,为什么?A:最常见的原因是那个窗口以管理员权限运行(任务管理器、部分系统设置页、某些安装程序)。Windows 不允许普通权限的程序移动权限更高的窗口。底部会写明是哪几个窗口,这种情况只能手动摆。
Q:快照里明明有 10 个窗口,为什么只找到 8 个?A:那两个程序已经关掉了。程序不会「帮忙」重新启动它们,只会跳过——打开之后可以再点一次还原,它会按快照摆好。右侧列表里灰掉、状态为「未打开」的就是这一类。
Q:同一个程序开了好几个窗口,会不会摆错?A:不会。配对时会先比可执行文件的完整路径,再比标题;同一个程序(比如浏览器)的多个窗口靠标题区分,标题完全相同的才按枚举顺序依次对应。改过标题的窗口(例如切换了标签页)仍能靠进程路径认出来,摆回原来的位置。
Q:快照保存在哪里?换电脑能带走吗?A:保存在本机 %APPDATA%\窗口布局快照\snapshots\ 目录下,一个快照一个 .json 文件,UTF-8 编码,可以直接用记事本打开查看。整个目录拷到新电脑的同一位置就能继续用(窗口标题与程序路径要能对上才会匹配)。
Q:能不能检测到显示器变化后自动还原?A:本版没有做自动还原,只做「检测到变化时提示你」。自动移动别的程序的窗口属于侵入性操作,判断错了会把用户正在做的事打断,所以这里保留一次确认。如果你确实需要自动触发,可以联系我们做定制。
Q:会不会改我的其它系统设置?A:不会。程序只调用两个写操作:SetWindowPos 改窗口位置与大小、ShowWindow 把最小化的窗口还原。不写注册表、不改系统设置、不结束进程、不联网、不上传任何数据。卸载就是删掉 exe,快照目录留着也不影响系统。
Q:还原之后窗口大小也变了吗?A:会按快照里记录的大小一起还原,这也是大多数人期望的行为。已经最大化的窗口不会被取消最大化,只会更新它「还原后」的尺寸。

技术实现与后续维护

工具是单个 exe,没有服务、没有驱动、不常驻后台(只在窗口打开时每 2 秒比对一次显示器配置)。更换显示器或调整缩放比例后不需要改任何配置,坐标会在还原时按当时的屏幕重新约束。如果以后要支持多显示器不同缩放比例的精确还原,或者要加「按程序分组还原」「开机自动应用某份快照」,可以在现有四层结构上直接扩展:枚举层加过滤条件、模型层加快照字段、执行层加动作、界面层加控件,各层互不影响。

可扩展方向:

  • 按程序分组还原:只把某一类程序(如浏览器)摆回原位,其它窗口不动
  • 开机或解锁时自动应用指定快照(需要常驻托盘,属定制范围)
  • 快照加标签与备注,支持按场景(公司/家里/演示)一键切换
  • 导出快照为文本,方便在几台机器之间同步布局

本工具免费提供使用,功能完整、不设限制。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发。

需要其它功能?可以定制

这个工具只做一件事:笔记本外接显示器,休眠、解锁、拔插 HDMI 之后所有窗口被挤到一块屏上堆叠,每次都要一个个重新拖。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。

常见的定制需求:

  • 需要开机自动恢复上次布局(托盘常驻)
  • 需要按程序分组还原或排除某些程序
  • 需要把布局同步到多台电脑
  • 需要适配特定行业软件的自绘窗口
  • 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
  • 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
  • 交付形式:定制项目交付可执行程序,支持后续版本迭代与长期维护

使用说明与免责声明

  • 本工具在本地运行,不联网、不上传任何数据到服务器。
  • 涉及文件改写的功能,请在使用前备份原始文件。
  • 软件完全免费,可自由使用与转发,请勿用于倒卖。
  • 因误操作造成的数据问题请自行承担。
免费下载窗口布局快照 v1.0.0
平台:Windows 7 / 10 / 11(32/64 位均可)大小:28 KB版本:v1.0.0更新:2026-10-25
提取码:aa2v(如提示需要,请输入)
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境,不联网、不上传数据。
分享到:

本文链接:https://www.biyeyuanma.cn/post/370.html

服务热线

加我微信

加我微信