尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

剖析SRWE的窗口树架构:用1.2.3层级化ID枚举并精准定位进程的全部窗口

发布时间:2026/9/25 1:56:12

资讯中心
01
ARTICLE

剖析SRWE的窗口树架构:用1.2.3层级化ID枚举并精准定位进程的全部窗口

剖析SRWE的窗口树架构:用1.2.3层级化ID枚举并精准定位进程的全部窗口
剖析SRWE的窗口树架构用1.2.3层级化ID枚举并精准定位进程的全部窗口【免费下载链接】SRWESimple Runtime Window Editor项目地址: https://gitcode.com/gh_mirrors/sr/SRWESRWESimple Runtime Window Editor是一款运行在 Windows 上的窗口管理工具只要选中一个正在运行的进程它就能把该进程的全部窗口枚举成一棵层级化窗口树并用1、1.2.3这样的层级化 IDHierarchical ID给每个窗口发一个门牌号让你快速定位、修改任意窗口的尺寸、位置与样式。本文带你从源码角度拆解 SRWE 的窗口树架构它如何枚举进程窗口、如何生成 1.2.3 式层级 ID、又如何凭这个 ID 在 Profile 中精准还原窗口的每一个参数。一、SRWE 是什么先认识这个窗口编辑工具SRWE 最初为窗口模式游戏而生很多游戏只能跑在窗口化模式下你可以用 SRWE 把它伪全屏化、去掉边框、甚至把分辨率临时拉高所谓 hotsampling来截高清图。核心能力可以概括为三步选进程从正在运行的应用程序列表中挑选一个目标进程例如游戏的 .exe看窗口树SRWE 把该进程的所有窗口展开成一棵树主窗口、子窗口一目了然改参数对选中的窗口修改 X/Y 坐标、宽高、样式标志即时生效并可保存为 Profile。整个流程在 README.md 中有更完整的场景说明界面主逻辑则集中在 MainForm.cs。二、窗口树是怎么建起来的三步枚举法窗口树的构建逻辑全部在 Window.cs 中核心方法是GetProcessWindows()它用三个步骤把一个进程变成一棵窗口树第 1 步先恢复主窗口。如果目标进程的主窗口正处于最小化状态SRWE 会先用ShowWindow把它恢复显示否则拿不到正确的几何信息见 Window.cs 的RestoreWindow。第 2 步按线程枚举顶层窗口。Windows 的窗口是挂在线程上的所以 SRWE 遍历进程的每一个线程对每个线程调用 Win32 的EnumThreadWindows回调EnumThreadWndProc把遇到的每个顶层窗口包成一个Window对象塞进列表。主窗口process.MainWindowHandle会被特殊处理Insert(0, ...)插到列表最前面见 Window.cs。第 3 步递归下钻子窗口。每个Window对象在构造时都会调用GetChildWindows()内部通过EnumChildWindows递归地把自己名下所有子窗口也包成Window并挂到m_childList上见 Window.cs。经过这三步一个进程的所有窗口就变成了一份父-子关系完整的对象列表界面层 MainForm.cs 的UpdateWindowTree()再把它渲染成 TreeView 节点——这就是你在 SRWE 里看到的窗口树。三、1.2.3 层级化 ID每个窗口的门牌号有了窗口树还不够。窗口的句柄HWND是动态分配的每次重启程序都可能变窗口标题可能为空、还可能重复。要稳定地指认某个窗口SRWE 的方案是层级化 ID。生成逻辑在 Window.cs 的GenerateHierarchicalIDs()里规则非常简洁顶层窗口按列表顺序编号第 1 个是1第 2 个是2依此类推子窗口 ID 父窗口 ID . 自己在父级中的序号从 1 开始如此递归就得到1.2.3这种从根到自己的路径式 ID。举个例子1是进程的主窗口1.2是主窗口下的第 2 个子窗口1.2.3则是1.2之下的第 3 个子窗口。每个 ID 都唯一定位到窗口树里的一个节点就像文件系统中的路径一样直观。这个 ID 在界面上有明确出口树节点显示名 层级 ID 窗口标题或十六进制句柄见DisplayName属性Window.cs选中某节点后Hier Num 一栏会填入该窗口的层级 IDMainForm.cs 的RefreshGeneralTab。四、用层级化 ID 精准定位窗口Profile 保存与还原层级化 ID 最实用的场景是Profile配置文件把一组窗口的当前状态存下来下次一键还原。保存方向勾选树中想要保存的节点点击 Save Profile 后SRWE 遍历树节点把每个被勾选窗口的HierID、PosX/PosY、Width/Height、Style/ExStyle 写进 XMLMainForm.cs 的AddWindowsToProfile。仓库自带的示例 Profile 可以直观感受格式例如 16-9_1920x1080.xml 里就是一行HierID1 ... Width1920 Height1080意思是把进程的主窗口ID 为 1设为 1920×1080。仓库还内置了 Profiles/ 目录下 16:9、16:10、21:9、1:1、4:5 等多种比例和分辨率的现成配置可以直接加载使用。还原方向加载 Profile 时UpdateWindowFromProfile会把HierID1.2.3按.拆成一组序号然后逐级下钻 TreeView先取第 1 级节点的第 1 个再进它的子节点取第 2 个再取第 3 个……最终精确命中标记的那个窗口把坐标、尺寸、样式逐项应用回去MainForm.cs。找不到对应节点时会抛出明确异常提示而不是静默出错。这就是1.2.3 层级化 ID 精准定位的完整闭环枚举时按树结构编号 → 保存时记录编号 → 还原时按编号寻路全程不依赖易变的句柄和标题。五、从窗口树到操作改尺寸、位置和样式定位到窗口后Window类提供了一组脏标记式的属性设置PosX、PosY、Width、Height、Style时只记录改动Changes标志位真正落到系统调用要等ApplyChanges()——它按需组装SetWindowPos/SetWindowLong的参数只提交发生过变化的部分Window.cs。界面层在此基础上封装了常用一键操作均定义在 MainForm.cs功能行为伪全屏Fake Fullscreen主窗口铺满整个屏幕分辨率任务栏模式Taskbar Mode主窗口对齐工作区保留任务栏可见去边框Remove borders同时清除 WS_DLGFRAME / WS_THICKFRAME 等边框样式九宫格对齐左/中/右、上/中/下快速摆位另外勾选Force EXITSIZEMOVE after window resize后SRWE 会在尺寸改动完成后向目标窗口补发一条WM_EXITSIZEMOVE消息模拟用户手动拖动缩放结束的信号让部分游戏正确重绘视口Window.cs。六、源码地图窗口树架构关键路径速查模块路径职责窗口树构建与层级 IDSRWE/Window.cs枚举线程窗口、递归子窗口、生成 HierID界面与窗口树渲染SRWE/MainForm.cs把窗口列表渲染为 TreeView处理选中与刷新Profile 保存/还原SRWE/MainForm.cs按 HierID 写入 XML、按 HierID 下钻定位进程选择对话框SRWE/OpenProcessDialog.cs弹出进程列表供用户挑选目标进程列表控件SRWE/ProcessSelectorCtrl.cs展示进程名、窗口标题并返回选中的 Process示例 ProfileProfiles/各比例/分辨率的窗口状态配置示例七、小结SRWE 的窗口树架构看似简单实则把三个 Windows 桌面编程的经典问题一次解决了窗口属于哪个线程按线程枚举、窗口之间谁是谁的孩子递归 EnumChildWindows、如何稳定指认某个窗口1.2.3 层级化 ID。理解了这套枚举 → 编号 → 按号寻路的设计你不仅能把 SRWE 用得更有章法也能从中获得一套通用的进程窗口遍历思路。 【免费下载链接】SRWESimple Runtime Window Editor项目地址: https://gitcode.com/gh_mirrors/sr/SRWE创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。