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 @@ + +