Phase 5: 系统托盘与开机自启

- 系统托盘: NotifyIcon 常驻, 程序化生成 32x32 图标, 左键切换显示/隐藏, 右键菜单(显示主界面/设置/彻底退出)

- 窗口关闭拦截: OnClosing 取消关闭改为 Hide(), 退出菜单执行真实 Shutdown()

- 开机自启: AutoStartHelper 写入/删除 HKCU\...\Run 注册表项, UI 开关按钮显示 ✔/⊗ 状态

- 静默启动: -autostart 参数下 mainWindow.Hide() 直接最小化到托盘

- 类型冲突解决: ImplicitUsings=disable + GlobalUsings.cs 统一全局 using, 消除 WPF/WinForms 共享类型冲突

- 测试: 75 tests total (含 AutoStartHelper 2 tests)
This commit is contained in:
2026-05-09 23:31:39 +08:00
parent 92beb46f22
commit 599964f078
8 changed files with 261 additions and 8 deletions

View File

@@ -0,0 +1,55 @@
using Microsoft.Win32;
namespace PersonalToolBox.Helpers;
/// <summary>
/// 开机自启动管理,通过写入 Windows 注册表 Run 键实现
/// </summary>
public static class AutoStartHelper
{
private const string RunKeyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
private const string AppName = "PersonalToolBox";
/// <summary>
/// 检查当前是否已设置开机自启动
/// </summary>
public static bool IsAutoStartEnabled()
{
try
{
using var key = Registry.CurrentUser.OpenSubKey(RunKeyPath);
return key?.GetValue(AppName) != null;
}
catch
{
return false;
}
}
/// <summary>
/// 设置或取消开机自启动
/// </summary>
public static void SetAutoStart(bool enable)
{
try
{
using var key = Registry.CurrentUser.OpenSubKey(RunKeyPath, writable: true);
if (key == null) return;
if (enable)
{
var exePath = Environment.ProcessPath;
if (exePath != null)
key.SetValue(AppName, $"\"{exePath}\" -autostart");
}
else
{
key.DeleteValue(AppName, throwOnMissingValue: false);
}
}
catch
{
// 注册表操作失败时静默忽略(可能是权限不足)
}
}
}