# 更新日志

## v2.1.5 — 2026-10-01

### 界面：设置 / 更新日志 / 关于 三合一，更新日志真渲染 Markdown

- **一个窗口三个页签**：原「设置」「更新日志」「关于/帮助」是三个独立窗口，现合并为**信息中心**（`设置 | 更新日志 | 关于` 页签切换），一处看全
- **更新日志真正渲染 Markdown**：Markdown 先转 RTF 再交给 RichEdit 渲染——`##` 标题（强调色 + 加粗）、`###` 小标题、`•` 列表、引用、分隔线、`**加粗**`、`` `代码` ``（等宽 + 强调色）、``` 代码块、`[文字](链接)` 全部按格式显示，并且**可滚动、可选中复制**；系统缺少 `msftedit.dll` 时自动退化为纯文本
- **设置页保留全部 5 个开关**：与主面板开关双向同步（勾选即生效），底部新增「查看运行日志」
- **托盘右键菜单新增「更新日志」**（原来只能从设置窗口的按钮进去）

### 联系方式：只显示本版本自己的，原项目仅作署名

- 主界面右上角与信息中心顶部显示**本版本官网**（`www.cwj666.top`，来自 `include\version.h` 的 `APP_SITE`）
- **移除了原项目的 GitHub 链接与 QQ 群**：那是原作者 / 上游项目的联系方式，不属于本版本；原项目只在「关于」页作为署名出现（`APP_UPSTREAM` / `APP_UPSTREAM_TEXT`）
- 交流群 `APP_QGROUP` 留空 = 界面完全不显示，填上自己的群号即可自动出现

### 新增：网页版界面（WebView2），与经典界面**随时双向切换**

- **整个界面都能用网页做**：主面板 / 设置 / 更新日志 / 关于 全部由 HTML 渲染（`ui\index.html`），与经典界面功能 1:1，命令走同一条 `WM_COMMAND`，逻辑一行没重写
- **双向切换**：网页版「设置 → 改用经典界面」、经典版「设置 → 改用网页界面」，**托盘右键菜单**里也有（自动按当前状态显示对应项）
- **选择会记住**：写在 `HKCU\Software\MythwareToolkit\UiMode`（web / native），下次启动直接沿用；`-native` 可临时强制经典界面
- **切换不掉链子**：切换时自动收掉模态的设置/关于窗口（原来它会留在屏幕上、并继续禁用主窗口）；窗口尺寸随模式调整（网页 980×700 可缩放 / 经典 660×372）
- **经典界面布局修复**：GDI 卡片布局固定按经典尺寸计算，网页模式只在网页真正接管后才放大窗口 —— 修掉"切回经典后卡片溢出窗口"的问题
- **配色一致**：给浏览器进程加 `--force-color-profile=srgb`（Chromium 默认按显示器 ICC 做色彩管理，会让网页区域偏暖，实测白色渲染成 `#FFFADF`），网页与经典界面配色一致
- **没有运行时的机器**：自动继续用经典界面；网页界面时点切换会明确提示"本机没有 WebView2 运行时"
- **外置界面优先**：程序目录有 `ui\index.html` 就用它（改界面不用重编译），文件 0 字节或明显损坏时自动退回内嵌副本，不会白屏

### 工程

- 新增 `src/webui.cpp` + `include/webui.h`：WebView2 承载层（内嵌 `WebView2Loader.dll` 运行时解压到 `%TEMP%`；状态用 `ExecuteScript` 推送，页面命令用 `postMessage` 回传）
- 新增 `src/mdrtf.cpp` + `include/mdrtf.h`：Markdown → RTF / 纯文本（无系统依赖，可单独测试）；`src/infowin.cpp` 重写为三合一信息中心
- 资源新增 `5 WebView2Loader.dll` / `6 index.html` / `7 logo.jpg`；链接增加 `-lole32 -loleaut32 -luuid`；编译步骤 13 → 15
- 构建脚本（`build.bat` / `build_portable.bat` / `Makefile`）加入 `mdrtf.o`（编译步骤 13 → 14）
- 新增 `ui/index.html`：HTML 版界面（设置 / 更新日志 / 关于 三页签，Markdown 由 JS 渲染），为「WebView2 主界面 + 本 GDI 界面兜底」的方案铺路

---

## v2.1.4 — 2026-10-01

### 变更：「防止截屏」默认关闭

- **默认不勾选**：主面板、悬浮球、弹出菜单、对话框默认都不再调用 `SetWindowDisplayAffinity`。直接效果就是——用远程桌面 / 向日葵 / ToDesk 时也能正常看见界面（之前默认开启，会把你自己远程看到的画面也挡成黑色）
- **该复选框升级为总开关**：勾选 → 主面板 + 悬浮球 + 菜单 + 弹窗**一起**防截屏；取消勾选 → **一起**关闭
- **新增 `-cap` 参数**：启动即开启防截屏，方便给教室场景单独做个快捷方式
- `-nocap` 保留：强制关闭，且复选框置灰不可选

> 权衡提醒：默认关闭后，教师端监控在未勾选时**能看到**本程序界面；需要遮挡时请手动勾选「防止截屏」，或用 `-cap` 启动。

> v2.1.4 已于 2026-10-01 打包发布（`bin\pkg\v2.1.4`），之后的界面大改动（网页版界面、双向切换等）归入 v2.1.5。

---

## v2.1.3 — 2026-10-01

### 修复：两个实例互相打架 / 主界面变"空壳黑窗"

- **单实例保护**：程序已在运行时，再次启动会**自动把已有实例的面板唤起来**并退出，不再出现两个实例抢 `Alt+B` 热键、抢托盘图标的情况
- **`Alt+B` 注册失败不再用模态弹窗阻塞启动**：原来这个弹窗在 `WM_CREATE` 里弹出，此时控件和托盘图标都还没创建，会留下一个"什么都没有的黑窗口 + 托盘图标没反应"。现在改到初始化完成之后，用**托盘气泡**提示
- **主窗口改为"初始化完成才显示"**：创建时不带 `WS_VISIBLE`，全部初始化结束后再 `ShowWindow`，任何启动阻塞都不会再留下空壳窗口

### 新增：`-nocap` 无防截屏模式

防截屏（`SetWindowDisplayAffinity`）会让主面板、悬浮球、弹出菜单、对话框在**任何截屏/远程/镜像画面**里变成黑色或直接消失——用远程桌面、向日葵、ToDesk 操作本程序时会"看不见界面"。

现在加命令行参数解决：

```bat
MythwareToolkit.exe -nocap     :: 本次运行不做防截屏（主面板/悬浮球/菜单/弹窗全部可见），重启后恢复默认
```

启动时会弹托盘气泡提示当前处于该模式，且「防止截屏」复选框自动置灰。

### 新增：`-unprotect` 救急开关

「防杀进程」生效后，任务管理器"结束任务"会被拒绝。若某个实例卡住又关不掉：

```bat
MythwareToolkit.exe -unprotect  :: 解除其它实例的防杀保护，之后任务管理器即可结束它们
```

### 其他

- 命令行参数改为遍历解析（原来只读第一个参数，且无参数启动时会读到 `NULL`）

---

## v2.1.2 — 2026-10-01

### 性能优化（机房机"启动后明显卡顿"专项）

- **状态刷新降载**：每 2 秒一次的极域状态刷新改为"一次进程快照匹配全部候选进程名"（原来最坏要做 5 次全进程快照）；状态栏、按钮文字、托盘提示**只在内容真的变化时才刷新**
- **挂起检测降频**：`GetProcessState()`（两次全系统进程/线程内核快照，最重的调用）由每 2 秒改为每 20 秒一次；点击杀极域/挂起/恢复、右键菜单、托盘菜单等操作后仍立即精确刷新
- **不再每 2 秒改窗口标题**：改为启动时 + 每次显示窗口时各随机一次，任务栏/Alt+Tab 不再持续重绘
- **防截屏去重**：`SetWindowDisplayAffinity` 增加状态缓存，只在期望状态变化时才调用；定时器兜底重设由 1s/2s/400ms 统一放宽到约 5 秒一次，避免反复惊动 DWM（极域广播时画面更顺）
- **强制置顶降频**：置顶轮询 250ms→1000ms（UIAccess 版 3s→5s），并给 `WM_WINDOWPOSCHANGED` 加防重入，不再与极域广播窗/黑屏窗来回抢 Z 序
- **日志写盘优化**：句柄复用、header/正文合并为一次 `WriteFile`、取消逐条 `FlushFileBuffers`（改为最多每 2 秒刷一次盘，崩溃时立即落盘），日志超 4MB 自动轮转
- **钩子线程修复+降频**：`解鼠标锁/解键盘锁` 的全局低级钩子改为"常驻 1 秒 + 正常泵消息"，装卸频率由 40 次/秒降到 1 次/秒，消除全系统输入发涩
- **Bug 修复**：`EnumWindowsProc` 中窗口标题短于"窗口化屏幕"时的越界读

### 构建 / 打包

- **版本号唯一来源**：新增 `include/version.h`（`APP_VERSION`），C++ 代码与打包脚本都从这里读取
- **打包按版本分目录**：`scripts\package.bat` 输出到 `bin\pkg\v<版本>\`，同名版本追加时间戳，**历史版本目录与历史 ZIP 永不删除**
- **包内携带完整更新日志**：`CHANGELOG.md`（含当前版本与全部历史版本）+ `README.md` + `RELEASE.md`
- `build.bat` / `build_portable.bat` 不再往 `bin\pkg\` 根目录丢文件，打包统一由 `package.bat` 负责

---

## v2.1.1 — 2026-06-28
>不更新到 06 - 28 版本并不影响，故版本号不变

### 新功能
- **退出黑屏安静**：主界面 + 悬浮窗右键均可触发。4 级递进（隐藏黑窗 → 取消置顶最小化 → 模拟 ESC → 确认后杀进程），前 3 级无感
- **UAC 提权**：MeltdownDFC/crdisk 和解除网络限制点击时自动弹 UAC 提权窗口
- **极域进程名多样识别**：依次尝试 `StudentMain.exe` / `StudentM.exe` / `StudentMain64.exe` / `Student.exe` / `MasterHelper.exe`
- **防杀进程**：启动即修改进程 ACL，任务管理器"结束任务"直接拒绝访问
- **全局对话框保护**：所有弹窗（关于/帮助/错误提示等）对教师端监控不可见

### 置顶与防截屏
- **双版轮询维持置顶（6-28）**：UIAccess 版 3000ms，便携版 250ms 
- **`WM_WINDOWPOSCHANGED` 事件驱动**：只在被挤下去时才重新置顶
- **防截屏定时重设**：主窗口 + 悬浮窗定时器循环调用 `SetWindowDisplayAffinity`，防止被外部清除


### Bug 修复
- **修复找不到极域进程**：`UpdateMythwareStatus` + `ControlMythware` 多项进程名匹配 + 详细日志
- **修复悬浮窗/对话框被截屏**：悬浮窗 `WM_CREATE` 加 `SetWindowDisplayAffinity`；启动时挂永久 WH_CBT 钩子，所有主线程弹窗自动防截屏

### UI 优化（6-28）
- **退出黑屏移至高级工具**：不占用极域控制组空间
- **新增显隐悬浮窗按钮**：高级工具内一键切换悬浮窗显示/隐藏
- **杀机房助手提升到主界面**：极域控制组内直接操作
- **窗口始终左上角**：每次打开复位到 (0, 0)

### 构建 / 脚本
- **`scripts/package.bat`**：编译+签名+打包 ZIP，一步到位
- **`scripts/cleanup.bat`**：一键清理证书、程序、快捷方式、临时文件
- **bin 目录**：`.o`/`.res`/`.exe` → `bin/`，产出 → `bin/pkg/`
- **源码注释**：13 个源文件全部添加模块说明注释

### 文档
- **README 目录**：章节索引快速跳转
- **RELEASE.MD文件**：发行版说明，面向最终用户
- **DEV.MD文件**：开发者文档（编译部署、脚本、故障排查、附录）

---

## v2.1.0 — 2026-06-25

### 关键 Bug 修复

- **修复学生机崩溃（0xC0000005）**：移除对极域注入 DLL（`LibTDProcHook`/`LibTDMaster`）的暴力卸载。`FreeModule` 后系统钩子仍指向已释放内存，悬浮窗收到窗口消息时触发 DEP 崩溃。保留 DLL 加载，通过自带钩子覆盖其行为
- **修复悬浮窗图标问题**：移除 GDI+ 依赖，改用纯 GDI `LoadImage(ICON)` + `DrawIconEx`。修复 `.ico` 文件格式（BMP DIB, wPlanes=1, 多分辨率 16~128px），兼容 `windres` 编译
- **修复 GDI 资源泄漏**：WM_PAINT 中 `SelectObject` 返回值全部保存/恢复，消除 Bitmap/Pen 对象泄漏
- **修复便携版弹"从服务器返回一个参照"**：便携版 manifest 编译时正确嵌入 `uiAccess=false`
- **修复解除网络限制无效**：`RemoveNetworkRestrictions` 中 `CreateFile` 判断改用 `INVALID_HANDLE_VALUE` 而非 `GetLastError`
- **修复 MeltdownDFC/crdisk 无法启动**：`RunEmbeddedExe` 改用 `CreateProcess`（替换废弃的 `WinExec`），修复 `WriteFile` 多写 1 字节溢出

### 新功能 / 增强

- **运行时日志系统**：所有关键操作写入 `%TEMP%\MythwareToolkit_run.log`（追加模式），含时间戳、级别（INFO/WARN/ERROR/CRASH）、函数名。`LOG_INFO/LOG_WARN/LOG_ERROR` 宏全局可用
- **崩溃日志增强**：完整寄存器转储（RIP/RSP/RBP/RAX/RBX/RCX/RDX/RSI/RDI/R8/R9）+ RBP 链栈回溯 + 模块定位 + 访问类型（READ/WRITE/EXECUTE）
- **弹出菜单防截屏**：悬浮窗右键、托盘右键、下拉菜单均通过 `SetWindowDisplayAffinity` 对教师端监控不可见

### 构建 / 工具

- **`convert_icon.ps1` + `convert_icon.bat`**：高质量 PNG→ICO 转换，多分辨率输出（16/24/32/48/64/128px），HighQualityBicubic 缩放，BMP DIB 格式
- **Makefile 清理**：移除便携版未使用的 `-lgdiplus`
- **资源管理**：`FLOATICO` 和 `MAINICON` 独立指向，方便后续替换悬浮窗图标

### 代码质量

- `CreateFloatingWindow` 失败时弹诊断框（仅失败时）
- 悬浮窗 `WM_CREATE` 增加 `IDI_APPLICATION` 兜底
- 图标绘制前通过 `GetIconInfo` 验证有效性
- `TrackPopupMenuProtected` 封装防截屏逻辑，统一调用

---

## v2.0.0 — 2026-06-24

### 代码重构（开发质量）

- **模块化拆分**：`main.cpp` 从 1623 行精简至约 500 行，拆分为 9 个独立模块
  - `main.cpp` — WinMain 入口 + WndProc 消息循环 + 托盘图标
  - `utils.cpp` — 日志格式化、错误处理、随机标题、权限提升、异常处理、日志文件写入
  - `process.cpp` — 进程查杀、挂起/恢复、状态检测、ntdll 动态加载
  - `bypass.cpp` — 注册表解禁、网络限制解除、USB 限制解除、hosts 清理
  - `assistant.cpp` — 学生机房管理助手全版本（v7.2 ~ v12.98）检测与杀进程
  - `mythware.cpp` — 极域密码读取、广播窗口检测、极域进程控制
  - `hooks.cpp` — 键盘钩子、鼠标钩子、窗口置顶线程
  - `floating.cpp` — 圆形悬浮窗（嵌入图片 ）
  - `psd.cpp` — 动态密码计算器对话框
- **公共头文件**：新增 `globals.h`，集中管理宏定义、全局变量声明、函数原型
- **编码统一**：所有源文件从 GBK 转为 UTF-8，IDE 中不再出现乱码
- **编译标志**：新增 `-fexec-charset=UTF-8`，配合 manifest `activeCodePage` 解决 ANSI 模式下中文显示

### 新功能 — 圆形悬浮窗

- 圆形悬浮窗，GDI+ 抗锯齿渲染，嵌入自定义图片（从资源段加载，exe 单文件自带）
- 始终置顶（`HWND_TOPMOST`），刷新频率优化为 250ms（减少与屏幕广播窗口的 Z 序冲突）
- **左键** → 切换主面板显示/隐藏
- **中键** → 屏幕广播窗口化/全屏化（一键操作）
- **右键** → 快捷菜单（打开面板/广播窗口化/杀掉极域/杀机房助手/解禁系统/退出）
- 支持拖拽移动（屏幕绝对坐标追踪，快速拖动不丢失）
- 悬停时微弱高亮反馈
- 主窗口关闭时悬浮窗常驻，点击可重新唤起；悬浮窗关闭时程序彻底退出

### UI 重设计

- 窗口尺寸：528×250 → **640×380**，空间充裕不再拥挤
- 左右分栏布局，各带 GroupBox（"极域控制" / "高级工具"）
- 按钮宽度自动适配列宽，文字不截断
- 底部功能开关独立 GroupBox（52px 高），间距均匀，彻底解决重叠问题
- "关于/帮助"移至右上角
- 密码字段添加"极域密码:"标签
- 版本号更新为 2.0.0

### 内存泄漏修复

- `RandomWindowTitle()`：`new char[11]` 永不释放 → `static char[11]` 缓冲区复用
- `FormatLogTime()`：`VirtualAlloc(64)` 永不释放 → `static char[64]` 缓冲区复用

### 默认行为优化

- 解鼠标锁、解键盘锁默认勾选并启用（开箱即用）
- 状态栏显示极域版本号（从注册表读取）
- 悬浮窗尺寸 33px，圆形纯图片无边框

### 日志自动落盘

- 每次启动自动写入 `%TEMP%\MythwareToolkit.log`
- 所有 Print/Println 输出同时写入内存和文件
- 程序退出时自动 Flush + Close，方便排查偶发 Bug

### 编译修复

- 补回 `#define SYSTEM_PROCESS_INFORMATION` 宏（`process.cpp`）
- `DWL_MSGRESULT` → `DWLP_MSGRESULT`（新版 MinGW 兼容）
- 中文智能引号 `""` → `「」`（UTF-8 编译兼容）
- `sys.manifest` 添加 `xmlns:asmv3` 命名空间声明
- 新增 `-lgdiplus -lole32` 链接（悬浮窗 GDI+ 图片加载）

### 构建系统

- **CMakeLists.txt**：支持 `cmake -B build -G "MinGW Makefiles" && cmake --build build`
- **build.bat**：自动检测 `D:\Dev\mingw64` / `C:\mingw64` / `C:\msys64\mingw64` / PATH，换电脑不需修改
- **Makefile**：9 个 `.o` 编译目标 + 完整头文件依赖

### 部署与签名

- **UIAccess 版**：需签名，部署到 `C:\Program Files\`，享受完整超级置顶
- **便携版**：`MythwareToolkit_Portable.exe`，不需签名、不挑路径、U盘即用
- `deploy.bat`：一键部署脚本（管理员运行，自动安装证书并复制文件）
- `sign.ps1`：PowerShell 自签名脚本
- `sys_portable.manifest`：便携版清单（`uiAccess=false`）

### 代码健壮性

- 卸载机房助手钩子 DLL（`LibTDProcHook` + `LibTDMaster`，32/64 位）
- `WM_ACTIVATE` / `NM_CLICK` 缓冲区 `c[10]` → `c[64]`，增加空指针检查

---

## 原作者版本

原仓库：[BengbuGuards/MythwareToolkit](https://github.com/BengbuGuards/MythwareToolkit)

- v0.5 ~ v1.2.5：原始版本，参见原仓库 Release 页面
