【Code with SOLO】Tuba Toolbox 硬件工具箱 — 用 WPF 重写图吧工具箱,彻底解决 UTF-8 乱码问题

# 【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 乱码** | :cross_mark: 严重乱码 | :white_check_mark: 完美支持 |

| **开发框架** | Delphi / Win32 | WPF + .NET 8 |

| **源代码** | :cross_mark: 闭源 | :white_check_mark: MIT 开源 |

| **高 DPI** | :cross_mark: 模糊 | :white_check_mark: 原生矢量清晰 |

| **发布形式** | 安装包 | :white_check_mark: 单文件 exe |

| **可定制性** | 仅支持换肤 | :white_check_mark: 可修改工具列表/样式 |

| **图标显示** | 内置图标资源 | :white_check_mark: 自动提取 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

-–

> :trophy: **参赛宣言**: 这不是一个炫酷的 AI 应用,但它是一个****真正解决了实际问题****的工具类项目。每一个硬件爱好者都值得拥有一款不会乱码的图吧工具箱。