From 259ce3dd11476930539322a31ff604ecc52cdbd1 Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Tue, 21 Apr 2026 02:16:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=8F=92=E4=BB=B6):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E9=87=8D=E5=90=AF=E6=9C=8D=E5=8A=A1=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=8F=8A=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 IAppRestartService 接口及其实现 AppRestartService,用于插件系统调用应用重启功能 将原 StartupPage 中的重启逻辑提取到 AppRestartHelper 工具类中 在 App.xaml.cs 中注册 AppRestartService 供插件使用 --- Ink Canvas/App.xaml.cs | 11 ++ Ink Canvas/Helpers/AppRestartHelper.cs | 106 ++++++++++++++++++ Ink Canvas/Plugins/AppRestartService.cs | 40 +++++++ .../SettingsViews/Pages/StartupPage.xaml.cs | 52 +-------- InkCanvas.PluginSdk/IAppRestartService.cs | 21 ++++ 5 files changed, 183 insertions(+), 47 deletions(-) create mode 100644 Ink Canvas/Helpers/AppRestartHelper.cs create mode 100644 Ink Canvas/Plugins/AppRestartService.cs create mode 100644 InkCanvas.PluginSdk/IAppRestartService.cs diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs index 6c3dc892..8b52712f 100644 --- a/Ink Canvas/App.xaml.cs +++ b/Ink Canvas/App.xaml.cs @@ -1113,6 +1113,17 @@ namespace Ink_Canvas LogHelper.WriteLogToFile($"Failed to register InkCanvasService: {ex.Message}", LogHelper.LogType.Error); } + try + { + var appRestartService = new Plugins.AppRestartService(); + Plugins.PluginManager.Instance.RegisterService(appRestartService); + LogHelper.WriteLogToFile("AppRestartService registered for plugins"); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"Failed to register AppRestartService: {ex.Message}", LogHelper.LogType.Error); + } + // 主窗口加载完成后关闭启动画面 mainWindow.Loaded += (s, args) => { diff --git a/Ink Canvas/Helpers/AppRestartHelper.cs b/Ink Canvas/Helpers/AppRestartHelper.cs new file mode 100644 index 00000000..73fbd184 --- /dev/null +++ b/Ink Canvas/Helpers/AppRestartHelper.cs @@ -0,0 +1,106 @@ +using Ink_Canvas.Windows.SettingsViews.Helpers; +using System; +using System.Diagnostics; +using System.Security.Principal; +using System.Windows; + +namespace Ink_Canvas.Helpers +{ + public static class AppRestartHelper + { + public static bool IsRunningAsAdmin() + { + try + { + var identity = WindowsIdentity.GetCurrent(); + var principal = new WindowsPrincipal(identity); + return principal.IsInRole(WindowsBuiltInRole.Administrator); + } + catch + { + return false; + } + } + + public static void RestartApp(bool asAdmin) + { + try + { + App.IsAppExitByUser = true; + + (Application.Current as App)?.ReleaseMutexForRestart(); + + string exePath = Process.GetCurrentProcess().MainModule.FileName; + + if (asAdmin) + { + var psi = new ProcessStartInfo(exePath) { UseShellExecute = true, Verb = "runas" }; + Process.Start(psi); + } + else + { + Process.Start("explorer.exe", "\"" + exePath + "\""); + } + + Application.Current.Shutdown(); + } + catch (Exception ex) + { + Debug.WriteLine($"重启应用时出错: {ex.Message}"); + } + } + + public static void RestartWithCurrentPrivileges() + { + RestartApp(IsRunningAsAdmin()); + } + + public static void RestartAsAdmin() + { + RestartApp(true); + } + + public static void RestartAsNormal() + { + RestartApp(false); + } + + public static void SwitchToUIATopMostAndRestart() + { + try + { + SettingsManager.Settings.Advanced.EnableUIAccessTopMost = true; + + if (!SettingsManager.Settings.Advanced.IsAlwaysOnTop) + { + SettingsManager.Settings.Advanced.IsAlwaysOnTop = true; + } + + SettingsManager.SaveSettingsToFile(); + + App.IsUIAccessTopMostEnabled = true; + RestartApp(true); + } + catch (Exception ex) + { + Debug.WriteLine($"切换到UIA置顶模式时出错: {ex.Message}"); + } + } + + public static void SwitchToNormalTopMostAndRestart() + { + try + { + SettingsManager.Settings.Advanced.EnableUIAccessTopMost = false; + SettingsManager.SaveSettingsToFile(); + + App.IsUIAccessTopMostEnabled = false; + RestartApp(IsRunningAsAdmin()); + } + catch (Exception ex) + { + Debug.WriteLine($"切换到普通置顶模式时出错: {ex.Message}"); + } + } + } +} diff --git a/Ink Canvas/Plugins/AppRestartService.cs b/Ink Canvas/Plugins/AppRestartService.cs new file mode 100644 index 00000000..1102d0ce --- /dev/null +++ b/Ink Canvas/Plugins/AppRestartService.cs @@ -0,0 +1,40 @@ +using Ink_Canvas.Helpers; +using Ink_Canvas.Plugins; + +namespace Ink_Canvas.Plugins +{ + public class AppRestartService : IAppRestartService + { + public bool IsRunningAsAdmin => AppRestartHelper.IsRunningAsAdmin(); + + public void RestartApp(bool asAdmin) + { + AppRestartHelper.RestartApp(asAdmin); + } + + public void RestartWithCurrentPrivileges() + { + AppRestartHelper.RestartWithCurrentPrivileges(); + } + + public void RestartAsAdmin() + { + AppRestartHelper.RestartAsAdmin(); + } + + public void RestartAsNormal() + { + AppRestartHelper.RestartAsNormal(); + } + + public void SwitchToUIATopMostAndRestart() + { + AppRestartHelper.SwitchToUIATopMostAndRestart(); + } + + public void SwitchToNormalTopMostAndRestart() + { + AppRestartHelper.SwitchToNormalTopMostAndRestart(); + } + } +} diff --git a/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml.cs b/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml.cs index fc7021d4..240f16ec 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/Pages/StartupPage.xaml.cs @@ -1,8 +1,8 @@ +using Ink_Canvas.Helpers; using Ink_Canvas.Windows.SettingsViews.Helpers; using System; using System.Collections.ObjectModel; using System.Diagnostics; -using System.Security.Principal; using System.Windows; using System.Windows.Controls; @@ -28,52 +28,10 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages _isLoaded = true; } - private static bool IsRunningAsAdmin() - { - try - { - var identity = WindowsIdentity.GetCurrent(); - var principal = new WindowsPrincipal(identity); - return principal.IsInRole(WindowsBuiltInRole.Administrator); - } - catch - { - return false; - } - } - - private void RestartApp(bool asAdmin) - { - try - { - App.IsAppExitByUser = true; - - (Application.Current as App)?.ReleaseMutexForRestart(); - - string exePath = Process.GetCurrentProcess().MainModule.FileName; - - if (asAdmin) - { - var psi = new ProcessStartInfo(exePath) { UseShellExecute = true, Verb = "runas" }; - Process.Start(psi); - } - else - { - Process.Start("explorer.exe", "\"" + exePath + "\""); - } - - Application.Current.Shutdown(); - } - catch (Exception ex) - { - Debug.WriteLine($"重启应用时出错: {ex.Message}"); - } - } - private void LoadSettings() { _isLoaded = false; - _isAdmin = IsRunningAsAdmin(); + _isAdmin = AppRestartHelper.IsRunningAsAdmin(); try { @@ -257,7 +215,7 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages if (result == MessageBoxResult.Yes) { - RestartApp(_isAdmin); + AppRestartHelper.RestartWithCurrentPrivileges(); } } catch (Exception ex) @@ -288,7 +246,7 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages if (result == MessageBoxResult.Yes) { App.IsUIAccessTopMostEnabled = true; - RestartApp(true); + AppRestartHelper.RestartAsAdmin(); } } catch (Exception ex) @@ -301,7 +259,7 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages { if (sender is Button btn && btn.Tag is bool asAdmin) { - RestartApp(asAdmin); + AppRestartHelper.RestartApp(asAdmin); } } diff --git a/InkCanvas.PluginSdk/IAppRestartService.cs b/InkCanvas.PluginSdk/IAppRestartService.cs new file mode 100644 index 00000000..b889ed9c --- /dev/null +++ b/InkCanvas.PluginSdk/IAppRestartService.cs @@ -0,0 +1,21 @@ +using System; + +namespace Ink_Canvas.Plugins +{ + public interface IAppRestartService + { + bool IsRunningAsAdmin { get; } + + void RestartApp(bool asAdmin); + + void RestartWithCurrentPrivileges(); + + void RestartAsAdmin(); + + void RestartAsNormal(); + + void SwitchToUIATopMostAndRestart(); + + void SwitchToNormalTopMostAndRestart(); + } +}