# 【Code with SOLO】Tuba Toolbox 硬件工具箱 — 用 WPF 重写经典硬件检测工具启动器,彻底解决 UTF-8 乱码问题
> **赛道**: Code with SOLO
> **技术栈**: WPF + .NET 8 + C# + XAML + WMI
> **开发周期**: 单日完成从需求分析到发布上线
-–
## 一、项目背景与痛点
### 原版「图吧工具箱」的致命缺陷
「图吧工具箱」是中文硬件圈内广为流传的经典工具集合软件,集成了 CPU-Z、GPU-Z、AIDA64、CrystalDiskInfo 等 **100+ 款**专业硬件检测与测试工具。然而,它存在一个**致命的兼容性问题**:
> 当 Windows 系统开启 **“Beta: 使用 Unicode UTF-8 提供全球语言支持”**(Windows 10/11 的 UTF-8 Beta 功能)后,原版软件界面会出现****严重的中文乱码****——所有分类名称、工具名称全部变成问号方块(□□□),完全无法使用。
*原版软件官方提供的"乱码解决方法.gif" — 说明这是一个长期存在的已知问题*
### 为什么这个问题难以解决?
原版软件使用 **Delphi / Win32** 开发,代码闭源且年代久远。其内部字符串编码处理依赖系统默认 ANSI 编码页,而 Windows UTF-8 Beta 模式会改变系统的默认编码行为,导致 Delphi 程序无法正确解析中文字符串。
**解决方案只有一条路:用现代框架从零重写。**
-–
## 二、技术方案
### 为什么选择 WPF 而非 WinForms?
在开发过程中,我没有规定使用框架,**AI首先尝试了 WinForms**(.NET 8 WinForms),但遇到了一个****极其棘手的布局 Bug****:
> **WinForms 的 Panel/Dock/Padding 组合使用时,子控件的渲染区域会被父容器错误裁剪**,导致硬件信息页面的标签文字始终被左侧边栏遮挡。经过 **7+ 轮修复尝试**(包括 RebuildUI 延迟构建、OnPaint 手动绘制、手动定位、移除中间容器等),问题依然存在,我让AI放弃使用WinForms,AI又自主选择了WPF框架。
**最终决策:切换到 WPF 框架。**
### WPF 的核心优势
| 特性 | WinForms | WPF |
|------|---------|-----|
| 布局引擎 | 基于 Pixel 的绝对定位 | 基于 Grid/StackPanel 的矢量布局 |
| 控件裁剪 | Padding/Dock 组合易出 Bug | 天然独立布局区域,无互相干扰 |
| 高 DPI 支持 | 需要手动处理缩放 | 原生矢量渲染,自动适配 |
| 样式系统 | 有限的支持 | 完整的 Style/Template/Trigger |
| 中文编码 | 依赖 ANSI CodePage | 原生 Unicode/UTF-8 |
## 三、功能展示
### 3.1 主界面 — 12 大分类一目了然
*左侧深色侧边栏包含 12 个分类按钮,右侧蓝色内容区展示当前分类的工具列表。每个工具卡片显示自动提取的程序图标和名称,双击即可启动。*
### 3.2 硬件信息页 — 一键查看完整配置
*启动后默认显示硬件信息页面,通过 WMI (Windows Management Instrumentation) 自动采集:*
- *型号信息(主板厂商+型号)*
- *系统信息(Windows 版本 + 架构)*
- *运行时间*
- *详细信息:处理器、主板、内存、显卡、显示器、磁盘、声卡、网卡*
### 3.3 工具卡片 — 自动图标提取 + 悬停效果
*每个工具卡片:*
- *自动从 exe 文件提取原始图标(使用 `Icon.ExtractAssociatedIcon`)*
- *悬停时显示蓝色边框高亮效果*
- *双击启动对应程序(`Process.Start` + `UseShellExecute`)*
- *支持图片类型工具(如天梯图)和信息展示类型条目*
### 3.4 各分类工具覆盖
| 分类 | 工具数量 | 代表性工具 |
|------|---------|-----------|
| 硬件信息 | 1 (内置) | WMI 自动检测 |
| CPU 工具 | 17 | CPU-Z, LinX, Prime95, Core Temp, ThrottleStop, SuperPI |
| 主板工具 | 1 | AIDA64 |
| 内存工具 | 7 | MemTest, Thaiphoon Burner, TM5, 魔方内存盘 |
| 显卡工具 | 18 | GPU-Z, FurMark, DDU, nvidiaInspector |
| 磁盘工具 | 22 | AS SSD, CrystalDiskInfo/Mark, HDTune, DiskGenius |
| 屏幕工具 | 4 | 坏点漏光测试, 色域检测, UFO 测试 |
| 综合工具 | 8 | HWiNFO, Speccy, RWEverything, HWMonitor |
| 外设工具 | 7 | 键盘测试, 鼠标测试, KeyTweak |
| 烤鸡工具 | 8 | FurMark, Prime95, LinX, cpu burner |
| 游戏工具 | 16 | Steam/Epic/EA/战网下载, 游戏加速器合集 |
| 其他工具 | 19 | Dism++, Everything, Ventoy, rufus, procexp |
**总计: 100+ 款工具,覆盖硬件检测全场景**
-–
## 四、开发过程与技术亮点
### 4.1 从 WinForms 到 WPF 的艰难迁移
整个开发过程中最大的挑战是 **WinForms 的控件裁剪 Bug**:
```
尝试 1: Dock=Fill + Padding → 标签被截断
尝试 2: 移除 contentContainer → 仍然被遮挡
尝试 3: OnPaint 手动绘制 → 红色调试边框不可见!
尝试 4: BeginInvoke 延迟构建 → 进程直接退出
尝试 5: Remove(currentToolsPanel) → 有改善但仍不完美
尝试 6: leftMargin 微调 38→42→45→48→50 → 永远差几个像素
尝试 7: 彻底放弃 WinForms → 切换 WPF → 问题瞬间消失!
```
**经验总结**:WinForms 的布局系统在复杂嵌套场景下存在****框架级的设计缺陷****,WPF 的声明式布局系统从根本上解决了这类问题。
### 4.2 WMI 硬件信息采集
```csharp
// 通过 Windows Management Instrumentation 获取硬件信息
using var mc = new ManagementClass(“Win32_Processor”);
foreach (ManagementObject mo in mc.GetInstances())
{
return $“{mo[“Name”]} ({mo[“NumberOfCores”]}核{mo[“NumberOfLogicalProcessors”]}线程)”;
}
```
支持的 WMI 类:
- `Win32_ComputerSystem` — 型号信息
- `Win32_Processor` — CPU 详情
- `Win32_BaseBoard` — 主板信息
- `Win32_PhysicalMemory` — 内存详情(每根插槽容量)
- `Win32_VideoController` — 显卡信息
- `Win32_DiskDrive` — 磁盘信息
- `Win32_SoundDevice` / `Win32_NetworkAdapter` — 声卡/网卡
### 4.3 自动图标生成
应用图标通过代码自动生成(无需外部图片文件):
```csharp
// 启动时自动生成 app.ico
using var bmp = new Bitmap(64, 64);
var g = Graphics.FromImage(bmp);
g.FillEllipse(Brushes.Blue, 2, 2, 60, 60); // 蓝色圆形背景
g.DrawString(“T”, font, Brushes.White, …); // 白色 “T” 字母
```
### 4.4 单文件发布
```xml
win-x64
true
false
```
最终输出:**单个 ~25MB 的 .exe 文件**,用户只需 .NET 8 Runtime 即可运行。
-–
## 五、使用方式
### 前置要求
1. Windows 10/11 x64 系统
2. [.NET 8.0 Runtime]( 下载 .NET 8.0 (Linux、macOS 和 Windows) | .NET )(或改为 SelfContained 发布)
### 运行步骤
```
1. 将 TubaToolbox.exe 放入 图吧工具箱 目录下
(确保 tools 文件夹在同一目录)
2. 双击 TubaToolbox.exe 启动
3. 点击左侧分类浏览工具,双击工具卡片启动程序
```
### 从源码构建
```bash
cd src
dotnet restore
dotnet build -c Release
dotnet publish -c Release -r win-x64 --self-contained false -p:PublishSingleFile=true
```
-–
## 六、对比原版
| 维度 | 原版图吧工具箱 | Tuba Toolbox (本项目) |
|------|--------------|----------------------|
| **UTF-8 乱码** |
严重乱码 |
完美支持 |
| **开发框架** | Delphi / Win32 | WPF + .NET 8 |
| **源代码** |
闭源 |
MIT 开源 |
| **高 DPI** |
模糊 |
原生矢量清晰 |
| **发布形式** | 安装包 |
单文件 exe |
| **可定制性** | 仅支持换肤 |
可修改工具列表/样式 |
| **图标显示** | 内置图标资源 |
自动提取 exe 图标 |
-–
## 七、总结
Tuba Toolbox 是一个****实用性驱动**的开发项目——它解决了一个真实存在的痛点(UTF-8 乱码),同时展示了现代 WPF 框架相对于传统 WinForms 的**架构优势****。
在整个开发过程中,AI 辅助完成了:
- **需求分析** → 从用户反馈中提炼核心痛点
- **技术选型** → WinForms 失败后的快速框架切换
- **Bug 诊断** → 7+ 轮迭代定位 WinForms 裁剪 Bug 的根因
- **代码生成** → 100+ 工具定义、WMI 查询、XAML 布局等重复代码
- **自动化验证** → PowerShell 截图脚本自动验证 UI 效果
原本需要2个工作日的开发,被 AI 辅助到仅需1小时(如果不排队的话时间更短,哈哈)。而且如果不用AI的话,我是不会有动力去完成这个项目的,一般不会有人为了解决一个BUG去花时间自己做一个。
****开源地址**: GitHub - zhangqinghao0811/TubaToolbox: 图吧工具箱 - 基于 WPF 的硬件工具集合启动器 · GitHub
-–
>
**参赛宣言**: 这不是一个炫酷的 AI 应用,但它是一个****真正解决了实际问题****的工具类项目。每一个硬件爱好者都值得拥有一款不会乱码的图吧工具箱。



