diff --git a/PersonalToolBox.Tests/Helpers/AutoStartHelperTests.cs b/PersonalToolBox.Tests/Helpers/AutoStartHelperTests.cs
new file mode 100644
index 0000000..4fcd539
--- /dev/null
+++ b/PersonalToolBox.Tests/Helpers/AutoStartHelperTests.cs
@@ -0,0 +1,22 @@
+using PersonalToolBox.Helpers;
+
+namespace PersonalToolBox.Tests.Helpers;
+
+public class AutoStartHelperTests
+{
+ [Fact]
+ public void SetAutoStart_Disable_NoExceptions()
+ {
+ // 确保不抛异常
+ AutoStartHelper.SetAutoStart(false);
+ }
+
+ [Fact]
+ public void SetAutoStart_Enable_NoExceptions()
+ {
+ // 确保不抛异常
+ AutoStartHelper.SetAutoStart(true);
+ // 清理
+ AutoStartHelper.SetAutoStart(false);
+ }
+}
diff --git a/PersonalToolBox/App.xaml.cs b/PersonalToolBox/App.xaml.cs
index 53db601..19dc181 100644
--- a/PersonalToolBox/App.xaml.cs
+++ b/PersonalToolBox/App.xaml.cs
@@ -9,7 +9,7 @@ namespace PersonalToolBox;
///
/// WPF 应用程序入口,负责依赖注入容器初始化和启动主窗口
///
-public partial class App : Application
+public partial class App : System.Windows.Application
{
public static IServiceProvider Services { get; private set; } = null!;
@@ -49,7 +49,16 @@ public partial class App : Application
dataService.Load();
var mainWindow = Services.GetRequiredService();
- mainWindow.Show();
+
+ // -autostart 参数:开机自启时隐藏窗口
+ if (e.Args.Contains("-autostart", StringComparer.OrdinalIgnoreCase))
+ {
+ mainWindow.Hide();
+ }
+ else
+ {
+ mainWindow.Show();
+ }
}
catch (Exception ex)
{
diff --git a/PersonalToolBox/GlobalUsings.cs b/PersonalToolBox/GlobalUsings.cs
new file mode 100644
index 0000000..a541fb9
--- /dev/null
+++ b/PersonalToolBox/GlobalUsings.cs
@@ -0,0 +1,20 @@
+global using System;
+global using System.Collections.Generic;
+global using System.Collections.ObjectModel;
+global using System.Collections.Specialized;
+global using System.ComponentModel;
+global using System.Diagnostics;
+global using System.IO;
+global using System.Linq;
+global using System.Runtime.InteropServices;
+global using System.Threading;
+global using System.Threading.Tasks;
+global using System.Windows;
+global using System.Windows.Controls;
+global using System.Windows.Data;
+global using System.Windows.Input;
+global using System.Windows.Interop;
+global using System.Windows.Media;
+global using System.Windows.Threading;
+global using Microsoft.Extensions.DependencyInjection;
+global using Microsoft.Win32;
diff --git a/PersonalToolBox/Helpers/AutoStartHelper.cs b/PersonalToolBox/Helpers/AutoStartHelper.cs
new file mode 100644
index 0000000..76bceb6
--- /dev/null
+++ b/PersonalToolBox/Helpers/AutoStartHelper.cs
@@ -0,0 +1,55 @@
+using Microsoft.Win32;
+
+namespace PersonalToolBox.Helpers;
+
+///
+/// 开机自启动管理,通过写入 Windows 注册表 Run 键实现
+///
+public static class AutoStartHelper
+{
+ private const string RunKeyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
+ private const string AppName = "PersonalToolBox";
+
+ ///
+ /// 检查当前是否已设置开机自启动
+ ///
+ public static bool IsAutoStartEnabled()
+ {
+ try
+ {
+ using var key = Registry.CurrentUser.OpenSubKey(RunKeyPath);
+ return key?.GetValue(AppName) != null;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ ///
+ /// 设置或取消开机自启动
+ ///
+ 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
+ {
+ // 注册表操作失败时静默忽略(可能是权限不足)
+ }
+ }
+}
diff --git a/PersonalToolBox/PersonalToolBox.csproj b/PersonalToolBox/PersonalToolBox.csproj
index b361992..425c985 100644
--- a/PersonalToolBox/PersonalToolBox.csproj
+++ b/PersonalToolBox/PersonalToolBox.csproj
@@ -4,8 +4,9 @@
WinExe
net8.0-windows
enable
- enable
+ disable
true
+ true
diff --git a/PersonalToolBox/ViewModels/MainViewModel.cs b/PersonalToolBox/ViewModels/MainViewModel.cs
index 65f335a..0f56187 100644
--- a/PersonalToolBox/ViewModels/MainViewModel.cs
+++ b/PersonalToolBox/ViewModels/MainViewModel.cs
@@ -63,6 +63,9 @@ public partial class MainViewModel : ObservableObject
[ObservableProperty]
private string _currentTheme = "Dark";
+ [ObservableProperty]
+ private bool _isAutoStart;
+
// ───────────────────────────── 命令 ─────────────────────────────
[RelayCommand]
@@ -78,6 +81,27 @@ public partial class MainViewModel : ObservableObject
_logService.Info($"已切换到{(CurrentTheme == "Dark" ? "暗黑" : "明亮")}主题");
}
+ ///
+ /// 切换开机自启动
+ ///
+ [RelayCommand]
+ private void ToggleAutoStart()
+ {
+ IsAutoStart = !IsAutoStart;
+ AutoStartHelper.SetAutoStart(IsAutoStart);
+ _dataService.Config.AutoStart = IsAutoStart;
+ _dataService.Save();
+ _logService.Info(IsAutoStart ? "已启用开机自启动" : "已关闭开机自启动");
+ }
+
+ ///
+ /// 供 MainWindow 外部调用,用于输出提示信息
+ ///
+ public void LogServiceMessage(string message)
+ {
+ _logService.Info(message);
+ }
+
///
/// 打开添加工具弹窗
///
@@ -225,6 +249,7 @@ public partial class MainViewModel : ObservableObject
SelectedCategory = AllCategory;
CurrentTheme = _dataService.Config.Theme;
+ IsAutoStart = _dataService.Config.AutoStart;
ThemeHelper.ApplyTheme(CurrentTheme);
}
diff --git a/PersonalToolBox/Views/MainWindow.xaml b/PersonalToolBox/Views/MainWindow.xaml
index dec7267..16a49da 100644
--- a/PersonalToolBox/Views/MainWindow.xaml
+++ b/PersonalToolBox/Views/MainWindow.xaml
@@ -81,6 +81,7 @@
+
@@ -160,6 +161,28 @@
+
+