feat(插件): 添加应用重启服务接口及实现
添加 IAppRestartService 接口及其实现 AppRestartService,用于插件系统调用应用重启功能 将原 StartupPage 中的重启逻辑提取到 AppRestartHelper 工具类中 在 App.xaml.cs 中注册 AppRestartService 供插件使用
This commit is contained in:
@@ -1113,6 +1113,17 @@ namespace Ink_Canvas
|
|||||||
LogHelper.WriteLogToFile($"Failed to register InkCanvasService: {ex.Message}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"Failed to register InkCanvasService: {ex.Message}", LogHelper.LogType.Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var appRestartService = new Plugins.AppRestartService();
|
||||||
|
Plugins.PluginManager.Instance.RegisterService<Plugins.IAppRestartService>(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) =>
|
mainWindow.Loaded += (s, args) =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
|
using Ink_Canvas.Helpers;
|
||||||
using Ink_Canvas.Windows.SettingsViews.Helpers;
|
using Ink_Canvas.Windows.SettingsViews.Helpers;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Security.Principal;
|
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
@@ -28,52 +28,10 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages
|
|||||||
_isLoaded = true;
|
_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()
|
private void LoadSettings()
|
||||||
{
|
{
|
||||||
_isLoaded = false;
|
_isLoaded = false;
|
||||||
_isAdmin = IsRunningAsAdmin();
|
_isAdmin = AppRestartHelper.IsRunningAsAdmin();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -257,7 +215,7 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages
|
|||||||
|
|
||||||
if (result == MessageBoxResult.Yes)
|
if (result == MessageBoxResult.Yes)
|
||||||
{
|
{
|
||||||
RestartApp(_isAdmin);
|
AppRestartHelper.RestartWithCurrentPrivileges();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -288,7 +246,7 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages
|
|||||||
if (result == MessageBoxResult.Yes)
|
if (result == MessageBoxResult.Yes)
|
||||||
{
|
{
|
||||||
App.IsUIAccessTopMostEnabled = true;
|
App.IsUIAccessTopMostEnabled = true;
|
||||||
RestartApp(true);
|
AppRestartHelper.RestartAsAdmin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -301,7 +259,7 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages
|
|||||||
{
|
{
|
||||||
if (sender is Button btn && btn.Tag is bool asAdmin)
|
if (sender is Button btn && btn.Tag is bool asAdmin)
|
||||||
{
|
{
|
||||||
RestartApp(asAdmin);
|
AppRestartHelper.RestartApp(asAdmin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user