XMoni 版本更新日志
==================
作者: 隐者艾伦 (https://www.gongyesheji.org)
技术栈: C# .NET Framework 4.7.2, WinForms, LibreHardwareMonitorLib v0.9.6
──────────────────────────────────────────────────────────


V0.8.5 (2026-10-18)
────────────────
  界面改版：全部背景升级为毛玻璃质感（默认），并新增「玻璃 / 扁平」质感切换。

  [毛玻璃质感（默认主题）]
  - 窗口主体、标题栏、7 个折线图卡片、硬盘面板统一改为毛玻璃面板
  - 每个仪表环下方增加"玻璃透镜"：径向柔光 + 极细抖动 + 边缘高光，
    读数环不再悬空，而是落在一块弧形玻璃上
  - 表面是**均匀的乳白透光层**，没有可见颗粒、也没有局部亮斑：
    ① 竖向渐变底色（1.045 → 0.965，落差很小）② 顶部乳白漫射（白色 16α，
       覆盖上方 55%，是"磨砂"观感的主要来源）③ 1px 渐变描边（顶部 128α → 底部 36α）
       + 底部极淡的厚度阴影
  - **修复横向色带**：GDI+ 的渐变是"逐扫描线 + 8bit 量化且不抖动"，600px 高的面板
    只差 15 个色阶 → 每 ~40px 出现一条能看见的硬边（标题带更明显）。
    现改为**自己光栅化渐变并加入 8×8 Bayer 有序抖动（±0.5 LSB）**：
    相邻像素在两档之间交错，肉眼不可见，但色带彻底消失；
    光栅按"尺寸 + 颜色"缓存，每帧只做一次 blit（比原来三次渐变填充更省 CPU）
  - 硬盘面板改为**深色烟熏玻璃**（此前误设为浅色卡，白字看不清）；
    硬盘型号与百分比改为**纯白 #FFFFFF（不透明）**，行车字母标签同样纯白
  - 底色透明度取用户设置的 0.60 倍，让桌面真正透过来 —— 磨砂玻璃的前提是透光
  - 图钉与关闭按钮：**悬停立即有反馈** —— 红色调 + 白色内描边 + 内发光，
    并把光标切换成手形；按下时进一步加深（原先只是抬高浅色 alpha，
    在浅色面板上几乎看不出变化，等于没有反馈）
  - 布局、字号、配色项全部沿用原设置，只换表面材质

  [质感缓存（性能）]
  - 整窗背景（主体 + 标题带）渲染一次后缓存，每帧只做一次 blit；
    仅在窗口尺寸 / 背景色 / 透明度 / DPI 变化时重建
  - 实测毛玻璃相比扁平化多约 1.5~2% 单核占用（0.05% 全系统），
    未做缓存时是 4~4.5%，缓存后已接近 V0.8.4 的水平

  [设置：特效 → 界面质感]
  - 新增「玻璃质感 / 扁平化」二选一按钮，当前项高亮
  - 切换会**先保存设置再自动重启**（不丢其他未保存的修改），
    重启后以新材质渲染；「扁平化」完整保留 V0.8.4 的外观，可随时切回
  - 该设置项为 Theme（glass / flat），旧配置文件没有此项时默认 glass

  [多语言]
  - 9 语言同步新增 settings.theme / theme_glass / theme_flat / theme_hint

V0.8.4 (2026-10-18)
────────────────
  性能与兼容性专项：启动更快、数据更及时、CPU/内存占用更低，
  并针对 Intel / AMD / 海光 Hygon / 兆芯 Zhaoxin 做传感器与回退链加固。

  [启动速度]
  - 首帧时间 0.75s → **0.55s**，首帧有内容 0.93s → **0.66s**
  - 右键菜单（ToolStrip 构建 ~80ms）与托盘图标从启动路径移出，
    改为首帧之后由 BeginInvoke 构建；若用户在构建前就右键，则当场补建
  - InitFonts 增加输入签名比对，重复调用直接返回（构造函数原本会调两次）

  [数据产生速度]
  - 采集循环改为**周期精确**：只补睡剩余时间。原先是"干完活再睡满一个周期"，
    实际周期 = 工作耗时 + 间隔（实测 92ms + 300ms），等于把刷新率砍半
  - LHM 刷新改为**按时间**调度（CPU / GPU 各有独立截止时间），不再与循环次数耦合：
    便宜的数据源（CPU 占用、频率、网络、内存）跟随界面刷新率，
    昂贵的 MSR 采样保持自己的节奏
  - CPU 占用改用 PDH `% Processor Time`（与任务管理器同源，每次 ~0.1ms），
    不再依赖 LHM 的逐核负载传感器 → 仪表现在按界面刷新率跟手
  - 实测采样节拍 1.6 次/秒 → **3.2 次/秒**（同 CPU 预算下翻倍）

  [CPU 与内存占用]
  - LHM 只保留 **CPU 与 GPU** 两个节点：内存走 PDH、网络走 NetworkInterface、
    硬盘走 WMI，原先启用的 LHM Memory / Storage / Network 节点完全没被读取，
    却要付枚举开销、原生内存和（Storage）每次刷新的 SMART IOCTL
  - 网络速率读取：网卡**枚举结果缓存 3 秒**（实测 `GetAllNetworkInterfaces()`
    单次约 70ms，机器上装 Hyper-V / VPN / 蓝牙虚拟网卡时更慢），
    字节计数器仍然实时读取；网卡集合变化仍由指纹比对识别，异常时立即失效缓存
  - CPU 温度采用**自适应采样**：温度稳定时降到 2.4s 一次，一有变化立刻回到 1.0s
  - 硬盘 WMI 枚举 5s → **15s**（多层嵌套查询，界面用不到那么快）
  - 实测：CPU **15.7% → 10.3%（单核，长时稳定态 8.8%）**；
    工作集 **121.4MB → 103.9MB**，私有内存 **84.3MB → 70.8MB**，
    句柄 784 → 730，线程 26 → 22

  [内存稳定性 / 防溢出]
  - 160 秒连续采样（每 15s）：工作集在 91~94MB 之间锯齿波动，
    GDI 恒定、USER 恒定、句柄只降不升 → 无泄漏；
    驱动曲线后半段 +0.8MB/75s 为 GC 锯齿，非单调增长
  - 所有 LHM 硬件/传感器集合访问都加了 null 防护（陌生平台可能返回空集合）

  [多平台兼容性：Intel / AMD / 海光 / 兆芯]
  - 基准频率三级回退：WMI `MaxClockSpeed` → 注册表
    `HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~MHz`
    （厂商无关）→ 放弃（此时跳过性能计数器换算，改用 LHM 逐核时钟）
  - CPU 型号名在 LHM 无法识别时回退到 WMI `Win32_Processor.Name`，
    避免陌生国产平台标题栏只剩 "CPU"
  - PDH 计数器（`% Processor Performance` / `% Processor Time` / 可用内存）
    任何一个缺失都只是降级到其他数据源，不影响启动与显示
  - 性能计数器读失败会自动释放并置空，下次运行仍可恢复

V0.8.3 (2026-10-02)
────────────────
  修复 CPU 频率读数（与任务管理器对齐：混合架构停泊核拉低均值、
  MSR 锁定机型停在基准频率）与温度读数，并完成高 DPI / 缩放比例适配。

  [CPU 频率读数：与任务管理器对齐（13900K 等混合架构 + MSR 锁定机型）]
  - 现象：13900K 等混合架构上频率显示普遍偏低（2.5~3.7GHz），
    与任务管理器的 4.5~5.5GHz 明显不符
  - 根因：显示的是 LHM 逐核时钟的 **P-core 平均**，而混合架构上空闲的 P-core
    会停泊在 800MHz。实测本机：P-Core #1 = 5491、P-Core #2~#5 = 798.7、
    E-Core 全部 4293 → **平均值被停泊核拖到 ~2558MHz**，
    而 CPU 实际运行在 4.5GHz 以上
  - 修复：频率读数改用与任务管理器**相同的定义** ——
    `Processor Information\% Processor Performance ÷ 100 × 基准频率`；
    实测 pc=162~167 × 3000 = **4864~5018MHz**，与任务管理器一致。
    LHM 逐核时钟降为回退源（性能计数器不可用时仍可用），WMI 仍为最后兜底
  - 该口径对 MSR 锁定的笔记本同样适用 → 桌面与笔记本两条路径统一
  - 以下为原"MSR 锁定机型恒为基准频率"的修复说明：
  - 频率恒定为基准频率（2500 MHz）根因：
    旧逻辑只在"WMI 返回的 CurrentClockSpeed 恰好等于基准频率"时才用性能计数器，
    且把计数器结果钳位在 **基准频率 ×1.15** 以内。而 % Processor Performance
    在睿频时本来就远高于 100（基准 2.5GHz → 4.7GHz 约 188%），
    因此**每一个睿频读数都被这个上限丢掉**，显示永远停在基准频率
  - 实测佐证（13900KF，基准 3000MHz）：Win32_Processor.CurrentClockSpeed
    恒为 3000（与基准相同，无动态信息），% Processor Performance = 125.5
    → 真实频率 3764MHz，**旧上限 3450MHz 会把它判为无效**，新上限可正常接受
  - 修复：性能计数器改为**首选**回退源（它才是动态的），WMI 仅作兜底；
    上限放宽到基准频率 ×2.6（且不超过 6000MHz），计数器有效区间 20%~800%
  - 温度恒定为 0 根因：MSR 锁定时 LHM 读不到温度，退化路径把 **0 当作有效温度**输出
  - 修复：温度必须 >0 且 <120℃ 才算有效，否则显示 "--"（不再显示 0）
  - 新增 ACPI 热区回退（root\WMI:MSAcpi_ThermalZoneTemperature），
    仅在 LHM 完全没有温度读数时启用 → 不影响传感器正常的机器；
    只接受 15~110℃ 的合理值，且**若 30 秒内数值完全不变则判定为固件占位值并弃用**
  - 温度曲线在无读数时不再塞入 -1（此前会画出一条贴底的假直线）

  [高 DPI / 缩放比例适配]
  - 根因：字体缩放系数用的是**物理**画布高度（`画布高/680`），
    而显示器 DPI 本来就会让"点→像素"换算放大一次 →
    **DPI 被计算了两次**，字体相对版面越放越大
  - 实测：字体高度 / 控件高度 在 150% 下是 0.178，在 250%（4K 笔记本）下变成
    **0.339 —— 字体大了 1.9 倍**，这正是"字体非常大、图非常小"的原因
  - 修复：字号缩放改用**逻辑**画布尺寸（物理尺寸 ÷ DpiScale），
    DPI 只参与一次；其余固定像素常量（标题区高度下限、数值文本宽度下限、
    列间距、最小窗口尺寸、迷你图标题/数值下限）统一按 DpiScale 缩放
  - 新增：识别**窗口所在显示器**的实际 DPI（GetDpiForWindow），
    并响应 WM_DPICHANGED 重新布局 —— 在不同缩放比的显示器之间拖动窗口不会错位
  - 验证（模拟 96 / 144 / 240 DPI）：字体/版面比 0.1775 / 0.1780 / 0.1778，
    已完全一致；150% 下的版面与改动前**逐值相同**（无回归），
    最小窗口尺寸也随 DPI 缩放（此前 100% 缩放下被 700×600 硬下限撑变形）

V0.8.2 (2026-09-28)
────────────────
  [崩溃防护 · 全局异常兜底]
  - 新增 Application.ThreadException / AppDomain.UnhandledException 全局捕获
  - 任何界面/定时器异常不再导致程序闪退，改为提示并继续运行
  - 异常写入 %LOCALAPPDATA%\XMoni\XMoni.error.log（自动限长64KB）
  - 修复 Release 构建下 HWM 日志方法自递归导致的启动即退出问题

  [内存与句柄 · 长期运行]
  - 字体所有权重构：渲染器不再释放外部字体，消除双重释放与句柄泄漏
  - InitFonts 改为"先建新→再挂载→后释放旧"，杜绝使用已释放字体
  - 每次打开设置窗口不再泄漏 ~8 个 GDI 字体句柄
  - 托盘提示框字体、调试窗口字体、磁盘面板字体现已正确释放
  - 移除渲染热路径中每帧创建字体/GDI 对象的写法
  - UI 线程不再执行 WMI 磁盘枚举（大幅降低卡顿）

  [CPU 占用优化]
  - 采集周期跟随界面刷新率（SetInterval），不再固定 50ms 空转
  - 移除强制 GC.Collect 调用，交由运行时自然回收
  - 分层渲染缓存 Graphics 对象，避免每帧创建
  - 仪表在 0% 时不创建渐变画刷

  [多平台兼容性]
  - CPU 温度：过滤 5–120°C 之外的无效值（AMD SMU 故障值不再显示为温度）
  - CPU 频率：LHM 优先 P-core 平均 → 全核心平均 → WMI → 性能计数器 多级回退
  - CPU 频率：修复 Ryzen 返回 0 时覆盖有效值导致的数值闪动
  - 网络速率：适配器重连/计数器回绕时不再出现负值或异常峰值
  - GPU：Intel 核显自动隐藏温度曲线；PerfCounter 故障仅剔除失效项
  - 字体缺失时自动回退到可用字体族，不再因字体异常中断渲染
  - 圆角绘制加入退化矩形保护，避免 GDI+ 参数异常

  [网络速率为 0 时的显示修复]
  - 修复：数值为 0 时仪表的彩色指示弧被整段跳过（原 `sweep > 0.01f` 才绘制），
    仪表只剩深色背景环，"彩色读数指示"整段消失，看上去就像读数没了
  - 现在 0 值也在刻度起点绘制一小段彩色刻度（最小 2.5°）：
    实测速率为 0 时彩色弧像素 0 → 87，仪表在空载时依然"有读数"
  - 数字本身在所有情况下都有输出（FmtNetSpd(0) → "0.0"）；
    另加渲染层兜底：数值文本为空时显示 "--"，从机制上杜绝空白读数

  [健壮性]
  - 语言文件缺失/损坏不再导致启动失败
  - HardwareMonitor 全路径空引用防护（关闭设备时的竞态）
  - Stop() 改为带锁幂等实现，退出等待上限 1.5s
  - 关闭窗口改为单一受控流程，移除 Application.DoEvents 卡顿

  [网络上行/下行数值闪烁修复]
  - 根因：网卡集合发生瞬时变化（Wi-Fi 扫描/漫游、VPN 或 USB 网卡增删、
    驱动重载）或计数器回绕时，旧逻辑把无效差值"钳位为 0"并立即发布，
    于是仪表被强制刷成 0，下一个采样又恢复真实值 → 数值消失约 1 秒后重现
  - 修复：仅当两次采样来自"同一组网卡"时才发布速率；
    无效差值不再发布 0，而是保留上一次有效读数
  - 新增网卡集合指纹（按网卡 Id 拼接），集合变化时静默重新对齐基线
  - 单个网卡取统计失败时丢弃整次采样（避免发布"部分网卡"的错误速率）
  - 仅当所有可用网卡持续缺失 >2.5s 才判定为真正空闲并显示 0
  - 采样节流：LHM 的 Cpu.Update() 需读取大量 MSR（13900K 上约 380ms/次），
    原先每轮都更新会让整个采集循环只有 ~1.5Hz，单个异常采样会在屏幕上
    停留 1 秒以上。现在 CPU 与 GPU 交错更新（各占一轮），
    网络/内存等廉价数据源得以跟上界面刷新率
  - 实测：网络数值刷新 2.6 次/秒（此前固定约 0.64 秒/次），
    强制注入"无效差值"触发条件下 0 次空白帧、字形墨迹波动 ±0.6%

  [启动速度与"打开后不显示界面"修复]
  - 根因：LHM 的 Computer.Open() 仍运行在 UI 线程（Form.Load 内），
    实测单次 **3184ms**（13900K + 1 块 GPU；显卡/硬盘更多的机器上更久，
    这就是"打开后要十几秒才看到界面"甚至"打开后不显示"的原因）
  - 修复：把 Computer.Open() 与传感器枚举整体移到采集线程执行，
    UI 线程不再等待；标题栏先显示"数据加载中，请稍等…"
  - 实测首帧呈现时间 **3643ms → 509ms**，外部观测"窗口可见且已绘制"
    **3.74s → 0.70s**（LHM 枚举依然约 3s，但已完全不阻塞界面）
  - 若 Open() 完全卡死，界面仍可正常响应/关闭，不再出现"无界面"状态

  [窗口位置越界自愈]
  - 根因：窗口位置从 settings.ini 恢复且不做校验。当显示器布局变化
    （笔记本插拔扩展屏、改分辨率/排列）后，保存的坐标可能落在屏幕外。
    本程序是无边框且不在任务栏显示的窗口，一旦越界用户就"打不开界面"了
  - 修复：启动时按当前显示器布局校验保存位置；可见面积不足 1/4 时
    自动居中到主屏工作区，否则轻推至完整落在所选显示器内
  - 同时修复多显卡机器只显示 1 行 GPU：硬件树打开后按实际显卡列表重建行
    （此前行在构造期创建，当时列表还是空的，多余显卡永远不会出现）

  [界面"假死"自愈]
  - 拖动/缩放过程中若 MouseUp 丢失（被 UAC 弹窗、Alt+Tab 抢焦点），
    原逻辑会永久停留在"拖动中"而不再重绘 → 看起来像界面卡死/不显示
  - 修复：重绘前检测鼠标键已全部松开则自动结束拖动/缩放状态

V0.8.1 (2026-06-25)
────────────────
  [启动速度优化]
  - LHM Computer.Open() 从构造函数延迟到 Start() 执行
  - 窗口先渲染"数据加载中"，后台线程初始化硬件传感器
  - 启动时间从5-10秒缩短为瞬间显示UI+后台加载

  [LibreHardwareMonitorLib v0.9.6]
  - 升级到最新 LHM v0.9.6（2025-02-14发布）
  - 新增 Intel 集成 GPU 温度/时钟/电压传感器支持（Alder Lake Ring Bus/MSR）

  [GPU传感器增强]
  - 新增 GPU Clock (SensorType 1) 时钟传感器匹配
  - Load 传感器匹配新增 D3D通配模式 + 通用负载模式
  - 解决 1650Ti/Intel集显 等非标传感器名无法匹配的问题

  [CUDA智能分级]
  - RTX/Quadro/Tesla/A-series: GPU Load ≥0% 即显示CUDA
  - GTX/GT/MX 系列: GPU Load >5% 才显示CUDA（避免空载误显）
  - 标题栏"CUDA"徽章与折线图显示逻辑一致

  [PerfCounter LUID去重]
  - InitGpuPerfCounter 按LUID去重，每个物理GPU只创建1个计数器
  - 修复 4090系统上 ~50个PerfCounter 刷屏导致启动延迟

  [GPU品牌自动适配]
  - 品牌检测改为运行时（isNvidia变量），解决初始化时机问题
  - Intel集显自动隐藏温度仪表（Temp<0 && MemJunc<0 判定）

  [9语言国际版]
  - 新增日/韩/法/德/阿拉伯/葡/西 7种语言 JSON 字库
  - 首次启动自动检测 Windows 系统语言匹配
  - 中文系统→中文，其他→英语，后续记住用户选择

  [内存第二轮审计]
  - HardwareMonitor.Stop() 补全 _ramCounter/_cpuPerfCounter/_gpuPerfCounters Dispose
  - ReadGpuSensors catch 块先Dispose再null
  - HardwareMonitor 新增显式构造函数（Computer创建与Open分离）

  [DPI缩放]
  - Program.DpiScale 全局因子（144 DPI基准）
  - 窗口尺寸/标题栏/边距/按钮/列间距随DPI等比缩放
  - SettingsForm窗口尺寸同步缩放

  [UI增强]
  - 图钉按钮重绘为真实图钉造型（钉帽+针杆+针尖）
  - 关闭按钮三层状态：默认灰→悬停灰高亮→按下红色
  - 按钮悬停弹出独立提示框（至于最前 / 关闭程序）
  - 刷新间隔 100-1000 → 50-1000ms

  [网络速率自适应]
  - ≥1 MB/s 显示 MB/s (2位小数)，<1 MB/s 显示 KB/s (1位小数)

  [稳定性/内存修复]
  - 内存泄漏全面修复（字体/WMI/GC优化）
  - USB弹出磁盘闪烁修复
  - 硬盘标题高度 1.6×→2.4×字体高
  - 托盘图标退出彻底清理

V0.8.0 (2026-06-24)
────────────────
  [应用按钮实时预览]
  - 修复设置面板「应用」按钮无效 (OnApplied回调机制)
  - 颜色/字体/刷新率/托盘设置立即应用到主界面
  - 无需关闭设置窗口即可预览变化

  [全颜色系统重连]
  - ApplyColors() 覆盖全部15个颜色属性
  - Gauge/Sparkline的BgColor/TextColor/GaugeColor/LineColor全部可配置
  - 主程序背景色支持自定义 (读取_settings.BgColor)
  - 硬盘高亮色默认为绿色 (200,52,210,118)，控制占用条颜色

  [5字体独立控制]
  - 新增细节字体/硬盘标题字体/硬盘容量字体三项
  - 统一全局ScaleFactor，所有控件字体大小一致
  - Gauge/Sparkline字体缓存失效机制 (InvalidateFontCache)
  - 恢复默认字体按钮一键重置5项
  - FontStyle (粗体/斜体/常规) 完整保存和恢复
  - 字体标签列250px，选择按钮85px，防截断

  [UI重构]
  - 左上角图钉置顶按钮 (钉子图标)，右上角灰色关闭按钮
  - 按钮垂直居中于标题栏 (y=2)
  - 主程序圆角20→15，硬盘模块圆角同步
  - 硬盘模块左右下边距与主程序圆角对齐
  - 主背景默认色: (189,199,213)

  [中英文语言完整切换]
  - BuildContextMenu/仪表标题/设置页全面国际化 (Loc.Get)
  - 语言切换自动重启清理托盘图标+互斥体
  - 英文翻译精修 (Disk Model Font/Drive Info Font/Base Freq等)
  - CPU标题栏基准频率国际化

  [其他设置模块重构]
  - Tab名"刷新"→"其他设置"
  - 刷新间隔/系统托盘拆为独立模块 (网络速度已删除)
  - TableLayoutPanel+250px固定标签列确保对齐

  [网络速率自适应]
  - >=1 MB/s 显示 MB/s (2位小数)，<1 MB/s 显示 KB/s (1位小数)
  - FmtNetSpd() 动态切换仪表单位

  [GPU智能适配]
  - NVIDIA GPU 显示 CUDA折线图；Intel/AMD GPU 隐藏CUDA
  - Intel集显自动隐藏温度/显存温度 (Temp<0 && MemJunc<0判定)
  - 非NVIDIA GPU的VRAM折线图填满整列，上缘与频率对齐
  - RTX 5090等新显卡CUDA识别修复 (PerformanceCounter回退LHM GPU Core)
  - 品牌检测改为运行时匹配 (解决CreateGauges时GPU名未知的问题)

  [DPI缩放支持]
  - Program.DpiScale = currentDpi/144 (150%=1.0, 100%=0.67)
  - 窗口尺寸/标题栏/边距/按钮/列间距随DPI同比缩放
  - 字体(point)保持系统自动适配，像素尺寸手动缩放

  [内存泄漏全面修复]
  - GaugeRenderer/SparklineRenderer.Dispose 补全 TitleFont/ValueFont 释放
  - InitFonts 旧字体替换前先Dispose，新增_detailFont字段追踪
  - WMI ManagementObjectCollection 三处using包装
  - 移除 AppSettings.TitleFont/ValueFont 泄漏属性
  - GC.Collect 降频(25→60帧) + 改非阻塞模式
  - SettingsForm PickFont 临时Font using包裹

  [稳定性修复]
  - USB弹出时磁盘信息闪烁修复 (_lastGoodDisks缓存 + 大小写不敏感)
  - 硬盘标题高度 1.6×→2.4×字体高，防止第二行被遮挡
  - 托盘图标退出彻底清理 (Visible=false→Dispose→DoEvents)
  - 设置窗口左侧弹出不遮挡主程序
  - 表格重复调用IndexOutOfRange崩溃修复
  - Gauge/Sparkline缓存字体刷新修复

  [双显卡修复]
  - 修复1650Ti笔记本 GPU1 负载始终 0%
  - PerformanceCounter fallback 支持多GPU实例

  [版本号] V0.7.9 → V0.8.0
V0.7.9 (2026-06-23)

────────────────
  [多语言支持]
  - 新增 Language/zh.json 中文字库 (90+键)
  - 新增 Language/en.json 英文字库 (90+键)
  - 设置面板「字体和语言」页新增语言切换
  - 下拉选择语言 + 应用按钮 + 点击立即重启
  - 仪表标题、菜单、设置、提示全部国际化

  [网页国际化]
  - 新增 index-en.html 英文宣传页
  - 中美国旗 SVG 图标 + 语言切换下拉菜单
  - 手机端汉堡菜单 (英文页)

  [英文页全量翻译]
  - Hero / Features / Specs / Tech / Download / Changelog
  - 旧版日志 (V0.0-V0.6) 全部英文化
  - SEO meta / og / hreflang 双语言

  [UI修复]
  - 字体设置修复 (Sparkline 字体未更新)
  - 字体和语言页布局优化
  - 重启前释放 Mutex 避免重复提示
  - 托盘图标重启前清理

V0.7.8 (2026-06-22)

────────────────
  [按钮与交互]
  - 左上角置顶图钉按钮，hover 弹出置于最前提示
  - 右上角关闭按钮，hover 弹出关闭程序提示
  - 提示框使用独立 Form 渲染，可在窗口外正常显示
  - 右键菜单切换置顶 → 至于最前

  [CUDA 智能显示]
  - NVIDIA GPU: 标题显示 CUDA，启用 CUDA核心折线图
  - Intel/AMD GPU: 标题隐藏 CUDA，隐藏折线图，VRAM 占满整列
  - 大小写不敏感匹配

  [间距优化]
  - hdrGap 基准从 6px → 2px(mini)，等比放大

V0.7.7 (2026-06-22)
────────────────
  [磁盘显示修复]
  - 修复多盘符磁盘完全不显示的BUG（Samsung 3盘符消失）
  - 移除过早 return 跳过逻辑，驱动行最小高度 24→16px
  - 空间不足时自动截断而非整体跳过

  [硬盘区域增大]
  - 硬盘最低高度: max(150, 28%)，原 max(100, 18%)
  - 各分辨率下硬盘高度: 600→168px / 800→224px / 1000→280px / 1200→336px

  [分辨率预设]
  - 改为正方形: Mini(600×600)/小(800×800)/中(1000×1000)/大(1200×1200)
  - 默认首次启动为小(800×800)，最小窗口600×600

  [字体优化]
  - CUDA核心/显存占用数值字体: 10pt → 9pt，小分辨率下不再溢出

  [等距间距]
  - 全部标题上下统一6px HdrGap，标题居中于相邻行之间
  - 移除 TopMargin/RowGap 魔法数字

  [数据加载提示]
  - 标题栏末尾显示"（数据加载中，请稍等…）"，传感器就绪后自动移除

  [系统托盘]
  - 新增系统托盘图标，双击恢复，最小化隐藏
  - 关闭时自动清理托盘图标，消除残留

  [菜单对勾]
  - 切换置顶/系统托盘/Debug 三项增加 ✓ 对勾
  - 图钉按钮同步更新状态

  [Bug修复]
  - 修复发光效果开关设置不生效
  - 修复Debug窗口X关闭后菜单对勾不同步
  - 修复拖拽窗口时周期性卡顿（Bitmap复用+拖拽跳过渲染）

  [启动优化]
  - 移除200ms启动延迟，立即渲染
  - Bitmap缓存复用消除每帧3MB分配，减少GC暂停

  [CPU频率双曲线]
  - 蓝色实线（当前频率）+ 紫色虚线（睿频基准）

  [布局重构]
  - CPU/GPU信息标题行（型号/频率/显存/CUDA）
  - GPU仪表标题编号前缀: GPU1负载/GPU1频率/GPU1温度

V0.7.6 (2026-06-22)
────────────────
  [磁盘显示修复]
  - 修复多盘符磁盘全部不显示的BUG：移除过早的 return 跳过逻辑
  - 驱动行最小高度从24px降至16px，支持3+盘符紧凑显示
  - 最多按实际空间渲染，空间不足时自动截断而非整体跳过

  [分辨率预设重设]
  - 改为仅设置横向宽度，纵向自动计算: Mini(600)/小(800)/中(1000)/大(1200)
  - CalcAutoHeight(): 标题+间距+表头固定值 + 仪表行高等比计算
  - 纵向确保硬盘面板最低120px

  [等距间距]
  - 全部标题上下统一6px间距(HdrGap)，标题居中于相邻行之间
  - 移除 TopMargin/RowGap 魔法数字

V0.7.6 (2026-06-22)
────────────────
  [系统托盘]
  - 新增系统托盘图标(NotifyIcon)，双击恢复窗口
  - 最小化时自动隐藏到托盘
  - 托盘右键菜单与主窗口右键菜单一致
  - 关闭时自动清理托盘图标，消除残留

  [菜单对勾]
  - "切换置顶"、"系统托盘"、"Debug" 三项增加 ✓ 对勾指示
  - 图钉按钮、菜单点击、设置界面三路同步状态

  [发光效果修复]
  - ApplyColors() 增加 GlowEnabled 传播，修复设置中发光开关无效

  [CPU优化]
  - SparklineRenderer: min/max延迟计算(EnsureMinMax)，仅在Draw时按需计算
  - 字体全局缓存: _hdrFont/_titleFont/_cachedPctFont 消除每帧分配

V0.7.5 (2026-06-22)
────────────────
  [CPU优化]
  - SparklineRenderer: min/max延迟计算(EnsureMinMax)，仅在Draw时按需计算一次
  - 避免AddValue每次触发LINQ Min/Max全队列扫描
  - 字体全局缓存: _hdrFont/_titleFont/_cachedPctFont 消除每帧3+次Font分配
  - 减少GDI对象创建频率

  [系统托盘]
  - 新增系统托盘图标(NotifyIcon)，双击恢复窗口
  - 最小化时自动隐藏到托盘
  - 托盘右键菜单与主窗口右键菜单一致
  - 右键菜单新增系统托盘勾选项
  - 设置界面新增启用系统托盘图标复选框
  - AppSettings持久化TrayEnabled配置
  - 退出时自动清理托盘图标

V0.7.5 (2026-06-22)
────────────────
  [内存优化]
  - 标题栏字体缓存: _titleFont 避免每帧 new Font()
  - CPU/GPU标题行字体缓存: _hdrFont 统一复用
  - 硬盘百分比字体缓存: _cachedPctFont 避免每盘每帧创建
  - MainForm Dispose 增加 _hdrFont/_titleFont/_diskPanel 清理
  - DiskPanelRenderer Dispose 增加 _cachedPctFont 清理

  [代码审查]
  - 确认无循环引用或无限递归
  - GDI对象全部 using 包裹即时释放
  - WMI查询降频10周期一次，防止COM对象堆积
  - 传感器日志自动修剪防止无限增长

V0.7.5 (2026-06-22)
────────────────
  [标题栏]
  - 标题栏加入当前版本号显示: "XMoni - 桌面硬件仪表盘 V0.7.5 Power by 隐者艾伦"

  [CPU标题行]
  - 基准频率改为中文显示: "基准频率: 3000 MHz"（原 "Base: 3000 MHz"）

V0.7.4 (2026-06-22)
────────────────
  [GPU标题行]
  - GPU标题行显示完整GPU型号: "GPU1: NVIDIA GeForce RTX 4090 | 24GB VRAM | CUDA"
  - GPU仪表标题修复: "GPU1GPU负载" → "GPU1负载", "GPU1GPU频率" → "GPU1频率"

  [标题颜色]
  - CPU和GPU标题行文字改为纯白色，更清晰

V0.7.3 (2026-06-22)
────────────────
  [显存占用]
  - 显存占用左上角显示格式: "0.9/24G"（已用/总量），原仅显示 "0.9G"

V0.7.2 (2026-06-22)
────────────────
  [CPU/GPU信息标题行]
  - 新增CPU信息标题行: CPU型号 + 基准频率
  - 新增GPU信息标题行: GPU型号 + 显存容量 + CUDA支持
  - 仪表标题改为编号前缀: CPU1/GPU1

  [多GPU支持增强]
  - 多GPU时每块GPU独立显示标题行+仪表行

V0.7.1 (2026-06-22)
────────────────
  [CPU频率双曲线]
  - CPU频率折线图新增紫色虚线（基准/最大频率）
  - 蓝色实线（当前频率） + 紫色虚线（睿频基准）
  - SparklineRenderer 新增 AddValue2 / LineColor2 / HasSecondLine

  [传感器增强]
  - HardwareMonitor 新增 GetCpuName() / GetCpuBaseFreq()

V0.7.0 (2026-06-20)
────────────────
  [多GPU支持]
  - 新增 GpuInfo 数据结构，每GPU独立采集传感器
  - MainForm 动态创建 GpuRow 列表
  - GPU按类型优先级排序: NVIDIA > AMD > Intel

  [GPU负载精确匹配]
  - 传感器匹配完全重写: D3D 3D（优先）→ GPU Core（fallback）
  - GPU总负载 = max(D3D 3D, GPU Core, D3D Cuda)
  - CUDA折线图仅显示真实CUDA值

  [网络速度修复]
  - 三层过滤: 接口类型+中文关键词+隐藏适配器
  - 解决中文系统虚拟网卡流量叠加问题

  [字体自适应缩放]
  - 仪表/折线图标题数值随窗口大小缩放 (0.75x-1.55x)

  [分辨率预设]
  - Mini 600×500 / 小 800×600 / 中 1000×750 / 大 1250×1000

  [硬盘面板优化]
  - 长型号自动缩小字号，多盘统一字体
  - 顶部标题栏深色圆角背景 + 纯白文字

  [关于页面]
  - 版本号 V0.7.0，文字黑色，新增版本日志按钮


V0.6.34 (2026-06-20)
────────────────
  [多GPU支持架构]
  - HardwareMonitor.cs: 新增 GpuInfo 类，ReadGpuSensors() 返回 List<GpuInfo>
  - GPUs按优先级排序: NVIDIA(3) > AMD(2) > Intel(1)
  - 保留向后兼容的单GPU getter（返回primary GPU）
  - Debug信息显示所有GPU详情

  [动态UI布局]
  - MainForm.cs: List<GpuRow> 管理GPU行
  - 单GPU: 布局不变；多GPU: 行高均分，最低80px

  [Sensor匹配修复]
  - 新增generic fallback：任何未被排除的Load传感器都能匹配
  - 修复单独立显卡GPU负载不更新的问题

V0.6.33 (2026-06-20)
────────────────
  [双显卡兼容]
  - ReadGpuSensors() 重构为优先级系统：NVIDIA=3 > AMD=2 > Intel=1
  - 每GPU独立采集再按优先级合并，解决 Intel iGPU 覆盖 NVIDIA 数据的问题

  [网络显示修复]
  - FmtSpd() v<1 MB/s 时不再硬编码返回 "0.000"
  - 改为 v.ToString("F3") 保留实际值（16KB/s → 0.016 MB/s）
  - 标题字号：10pt → 9pt Regular

V0.6.32 (2026-06-19)
────────────────
  [顶部标题栏重构]
  - 高度100px，TopMargin=125
  - 纯白18pt Bold文字，水平和垂直居中
  - 半透明深色背景，文字内容 "XMoni - 桌面硬件仪表盘"
  - 后续调整为高度30px，间距10px，9pt Regular

V0.6.31 (2026-06-19)
────────────────
  [标题文字颜色]
  - GaugeControl/SparklineRenderer 标题颜色恢复为深黑 TextColor
  - 标题区增加半透明深色背景（后移除，用户要求透明）
  - titleH 三处统一为 Math.Max(50, GetHeight*2.5f)

  [圆角统一]
  - 硬盘面板圆角 6px → 20px（与画布背景一致）
  - 标题栏新增 FillTopRoundedRectangle 顶部圆角20px
  - GraphicsExtensions 新增 TopRoundedRect 路径方法

V0.6.31-V0.6.30 之前 (2026-06-19)
────────────────
  [UI精细化调整]
  - 标题文字改回深黑色，去除半透明背景
  - 标题栏字体加粗→Regular，文字改为"XMoni - 桌面硬件仪表盘  Power by 隐者艾伦"
  - 标题背景、间距、圆角持续微调

V0.6.14 (2026-06-19)
────────────────
  [4K/高DPI自适应]
  - 所有文本高度使用 Font.GetHeight(g) 动态计算
  - 字体缓存：_cachedValueFont/_cachedTitleFont，DPI变化>0.01才重建
  - 缩放上限 Math.Min(1.55, ...)，防止文字溢出
  - 值文本高度上限 Math.Min(30, ...)，防止重叠

  [Intel集显兼容]
  - GpuIntel 硬件类型纳入GPU匹配循环
  - D3D 3D 传感器匹配 Intel iGPU

  [性能优化]
  - WMI查询降频：CPU频率/温度每10次迭代（2s）执行一次
  - 传感器日志修剪：>3000字符时截断，每50次迭代执行
  - 网络接口过滤：跳过 tunnel/bluetooth/virtual/vethernet/Hyper-V/VPN

  [内存泄漏修复]
  - GDI句柄泄漏：Bitmap.GetHbitmap() 必须调用 DeleteObject(hBmp) 释放
  - 字体泄漏：缓存 _cachedValueFont/_cachedTitleFont 代替每次 new Font()
  - WMI查询节流：磁盘信息每30次debug循环缓存一次
  - 传感器日志上限12000字符，防止无限增长

V0.6.13 (2026-06-19)
────────────────
  [逐像素Alpha背景透明]
  - 使用 UpdateLayeredWindow + BLENDFUNCTION(AC_SRC_ALPHA)
  - CreateCompatibleBitmap 持久化DC，无每帧 GetHbitmap 泄漏
  - 背景透明（OpacityPercent控制），仪表/文字/图钉保持完全不透明
  - g.Clear(Color.Transparent) 每帧清除防止残影
  - 尺寸变化时重新创建GDI位图

V0.6.12 (2026-06-19)
────────────────
  [版本信息]
  - 左上角版本文字改为白色
  - 默认透明度90%

V0.6.11 (2026-06-19)
────────────────
  [启动优化]
  - 降低启动延迟至200ms
  - 背景透明度独立控制（不影响仪表/文字）

V0.6.10 (2026-06-19)
────────────────
  [右键菜单扩展]
  - 新增分辨率预设: Mini 600×600 / 小 800×800 / 中 1000×1000 / 大 1200×1200
  - 新增刷新率预设: 50/100/300/600/1000ms
  - 新增透明度预设: 100%/75%/50%/25%/0%
  - 仪表大字改为18pt Bold

V0.6.9 (2026-06-19)
────────────────
  [依赖性修复]
  - 补齐 BlackSharp.Core.dll（第三个缺失的LHM间接依赖）
  - CPU温度/频率开始正常采集

V0.6.8 (2026-06-19)
────────────────
  [DiskInfoToolkit.dll]
  - 补齐 DiskInfoToolkit.dll 及其传递依赖
  - 磁盘传感器完整可用

V0.6.7 (2026-06-19)
────────────────
  [磁盘映射诊断]
  - WMI Win32_DiskPartition.DiskIndex 精确映射
  - ASSOCIATORS OF 查询逻辑分区→物理磁盘
  - Debug日志输出磁盘映射详情

V0.6.4-V0.6.6 (2026-06-19)
────────────────
  [RAMSPDToolkit-NDD.dll]
  - 补齐 RAMSPDToolkit-NDD.dll（LHM第一个缺失依赖）
  - LHM Computer.Open() 首次成功

  [数据传感器]
  - CPU频率：WMI Win32_Processor.CurrentClockSpeed + PerformanceCounter % Processor Performance
  - CPU温度：WMI MSAcpi_ThermalZoneTemperature + LHM package/core fallback
  - 网络速度：NetworkInterface.GetIPv4Statistics() 增量计算
  - 仪表透明背景渲染
  - 盘符按物理磁盘排序
  - 显存容量GB格式显示

V0.6.3 (2026-06-19)
────────────────
  [诊断增强]
  - 传感器名全量转储：启动时记录所有LHM传感器（类型/名称/值）到Debug日志
  - GPU传感器匹配增强：兼容GpuIntel类型、放宽功率/温度匹配条件
  - VRAM占用回退计算（Used/Total）

  [网络]
  - 网络接口选择更宽泛匹配，跳过Hyper-V接口

  [UI]
  - DebugForm: Label→TextBox(ReadOnly/Multiline)，支持Ctrl+A全选 Ctrl+C复制
  - 磁盘映射：Win32_DiskPartition.DiskIndex精确映射物理磁盘→分区→盘符
  - 磁盘面板：移除"OK"状态行，保留百分比符号
  - 图钉按钮：三角+竖线图标，未按下灰色/按下淡红，按下时窗口TopMost

V0.6.2 (2026-06-19)
────────────────
  [传感器采集增强]
  - Computer初始化日志（列出所有硬件和传感器数量）
  - CPU Load: 匹配"total"传感器；CPU Temp: 匹配"package" fallback "core"
  - RTX 4090 GPU传感器命名兼容多种模式
  - Network: PerformanceCounter改为类字段（解决每次new返回0）
  - 新增 VRAM Used/Total 跟踪

  [Debug信息扩展]
  - 新增: CPU频率、GPU频率/功率、GPU HotSpot、MemJunction、CUDA、VRAM占用、显存使用量、磁盘详情

  [界面布局]
  - Row 2改为5列: GPU负载 | GPU频率 | CUDA(上)+显存(下) | GPU温度 | 显存温度
  - 第3列上下拆分: CUDA核心占用率(上), 显存占用(下)
  - 硬盘按WMI物理磁盘分组显示

  [中文化]
  - 全部标签中文化: CPU负载/CPU频率/内存占用/网络上行/网络下行/GPU负载/GPU频率/GPU温度/CUDA核心/显存占用/显存温度
  - SettingsForm: 外观/字体/刷新/关于 四个Tab全部中文化
  - 右键菜单: 设置/切换置顶/退出

  [磁盘]
  - WMI Win32_DiskDrive 获取物理磁盘型号
  - ASSOCIATORS 查询将逻辑分区映射到物理磁盘
  - 按物理磁盘分组显示其下盘符

  [稳定性]
  - 启动延迟800ms再开始渲染（等待LHM初始化）
  - WinForms Timer代替Task.Delay（兼容性更好）

V0.6.1 (2026-06-19)
────────────────
  [编译修复]
  - 修复 FileNotFoundException (LibreHardwareMonitorLib.dll)
  - .csproj中5个DLL引用Private改为true
  - 移除CleanupLib构建后删除目标
  - DLL文件直接复制到输出目录

  [数据修复]
  - 添加 _monitor.Start() 调用（之前遗漏导致数据不显示）
  - 添加500ms延迟确保LHM Computer初始化完成
  - Debug日志输出传感器状态（每10次迭代）

  [布局调整]
  - 第1行(5列): CPU Load(仪表) | CPU Freq(折线图) | Memory(折线图) | Net Up(仪表) | Net Down(仪表)
  - 第2行(4列): GPU Load(仪表) | GPU Freq(折线图) | GPU Temp(仪表) | VRAM Temp(仪表)
  - 第3行(通栏): 硬盘面板(支持多物理硬盘及分区)
  - 移除: CoreFreqChartRenderer, SystemInfoPanelRenderer
  - SparklineRenderer新增 CustomValueText(左上角)和 PowerText(右上角)
  - CPU频率折线图: 左上角当前频率+单位
  - 内存折线图: 左上角已用/总量GB，右上角百分比
  - GPU频率折线图: 左上角当前频率，右上角功率

V0.6.0 (2026-06-19)
────────────────
  [全面重构 - 背景]
  - 备份文件存在大量UTF-8编码损坏（中文字符三字节序列末尾字节截断）
  - 字符串字面量缺少闭合引号，注释吞噬后续代码，变量声明被注释吃掉
  - 逐字节修复不可持续，决定完全重写核心文件

  [HardwareMonitor.cs - 完全重写]
  - LHM Computer API传感器采集架构
  - PerformanceCounter内存/网络数据采集
  - WMI磁盘信息和总内存（替代Microsoft.VisualBasic引用）
  - 200ms采集周期（5Hz，提升GPU更新速度）
  - CUDA load含回退逻辑：无专用CUDA传感器时使用GPU core load

  [MainForm.cs - 完全重写 (560行)]
  - 自由缩放窗口（MinimumSize 600×400）
  - GDI+自定义渲染管道：GaugeRenderer/SparklineRenderer/DiskPanel/CoreFreqChart/SystemInfoPanel
  - 鼠标拖动、边框缩放（8方向）、右键上下文菜单
  - 设置对话框完全集成

  [渲染引擎 - 全部重写]
  - GaugeControl.cs (GaugeRenderer): 弧线仪表，渐变颜色，发光效果，阈值警告
  - SparklineRenderer.cs: 折线图，网格线，区域填充，数值覆盖层
  - DiskPanelRenderer.cs: 硬盘面板，WMI物理磁盘分组
  - SystemInfoPanelRenderer.cs: 系统信息面板
  - CoreFreqChartRenderer.cs: CPU核心频率图表
  - DebugForm.cs: 诊断窗口

  [SettingsForm.cs - 完全重写]
  - 英文UI（避免中文编码问题）
  - 颜色/字体/刷新率持久化到 settings.ini

  [代码清理]
  - 删除不再需要的文件: WinRing0.cs, WinRing0Loader.cs, SuperIOReader.cs, HWiNFOReader.cs, NativeMethods.cs
  - 删除: MainForm_Simple.cs, TestWmiTemp.cs
  - 编译结果: 0错误, 3警告

V0.5.x (2026-06-19)
────────────────
  V0.5h:
  - 修复折线图文字过大遮挡：ValueFont 12pt→9pt，数值区域高度20px→22px，topOffset 26→24
  - 窗口调整：最小窗口800×480→900×520，"小"预设800×480→900×520
  - 左上角显示"XMoni桌面硬件仪表盘 V20260619.51"+"作者：隐者艾伦"
  - 硬盘面板：背景色加深 Argb(38,55,55,115)→Argb(60,30,30,80)，盘符颜色近纯白
  - SettingsForm新增"关于"页面，作者"隐者艾伦"超链接→https://www.gongyesheji.org

  V0.5g:
  - GDI+自定义仪表盘渲染（GaugeRenderer）基础版本
  - 折线图渲染器（SparklineRenderer）初始实现
  - 硬盘面板（DiskPanelRenderer）
  - Debug诊断窗口
  - 可拖拽/缩放无边框窗口
  - 单实例保护（Named Mutex）

V0.1.x - V0.4.x (2026-06)
────────────────
  - 初始版本：LibreHardwareMonitor 作为传感器采集后端
  - 基础仪表盘界面（WinForms GDI+）
  - 设置持久化（settings.ini 明文配置）
  - PerformanceCounter 数据源集成
  - WMI 磁盘信息和总内存采集
  - CPU/GPU/内存/网络/硬盘五维监控
  - 窗口TopMost置顶、无边框拖拽
  - 右键菜单基础功能（设置/退出）