diff --git a/Ink Canvas/Helpers/AutoUpdateHelper.cs b/Ink Canvas/Helpers/AutoUpdateHelper.cs index eed1b84e..3a4f50f5 100644 --- a/Ink Canvas/Helpers/AutoUpdateHelper.cs +++ b/Ink Canvas/Helpers/AutoUpdateHelper.cs @@ -411,6 +411,7 @@ namespace Ink_Canvas.Helpers LogHelper.WriteLogToFile($"AutoUpdate | Current application directory: {currentAppDir}"); LogHelper.WriteLogToFile($"AutoUpdate | Current process ID: {currentProcessId}"); + LogHelper.WriteLogToFile($"AutoUpdate | Silent update mode: {isInSilence}"); // 创建批处理文件来执行更新操作 string batchFilePath = Path.Combine(Path.GetTempPath(), "UpdateICC_" + Guid.NewGuid().ToString().Substring(0, 8) + ".bat"); @@ -468,21 +469,45 @@ namespace Ink_Canvas.Helpers // 启动更新后的应用程序 batchContent.AppendLine($"echo echo Update completed successfully! >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo :: 检查应用程序是否已经在运行 >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo tasklist /FI \"IMAGENAME eq Ink Canvas.exe\" | find /i \"Ink Canvas.exe\" > nul >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo echo 启动应用程序... >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo start \"\" \"{appPath}\" >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo ) else ( >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo echo 应用程序已经在运行,不再重复启动 >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo ) >> \"{updateBatPath}\""); + + // 根据是否为静默更新模式决定是否自动启动应用程序 + if (isInSilence) + { + // 静默更新模式下,自动启动应用程序 + batchContent.AppendLine($"echo echo 自动启动应用程序... >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo start \"\" \"{appPath}\" >> \"{updateBatPath}\""); + } + else + { + // 非静默模式下,检查应用程序是否已经在运行 + batchContent.AppendLine($"echo :: 检查应用程序是否已经在运行 >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo tasklist /FI \"IMAGENAME eq Ink Canvas.exe\" | find /i \"Ink Canvas.exe\" > nul >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo if %%ERRORLEVEL%% neq 0 ( >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo echo 启动应用程序... >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo start \"\" \"{appPath}\" >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo ) else ( >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo echo 应用程序已经在运行,不再重复启动 >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo ) >> \"{updateBatPath}\""); + } + batchContent.AppendLine($"echo exit /b 0 >> \"{updateBatPath}\""); batchContent.AppendLine($"echo goto EXIT >> \"{updateBatPath}\""); // 错误退出处理 - batchContent.AppendLine($"echo :ERROR_EXIT >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo start \"\" cmd /c \"echo Update failed! ^& pause\" >> \"{updateBatPath}\""); - batchContent.AppendLine($"echo exit /b 1 >> \"{updateBatPath}\""); + if (isInSilence) + { + // 静默模式下,不显示错误提示 + batchContent.AppendLine($"echo :ERROR_EXIT >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo echo Update failed! >> \"%temp%\\icc_update_error.log\" >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo exit /b 1 >> \"{updateBatPath}\""); + } + else + { + // 非静默模式下,显示错误提示 + batchContent.AppendLine($"echo :ERROR_EXIT >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo start \"\" cmd /c \"echo Update failed! ^& pause\" >> \"{updateBatPath}\""); + batchContent.AppendLine($"echo exit /b 1 >> \"{updateBatPath}\""); + } // 删除批处理文件自身 batchContent.AppendLine($"echo :EXIT >> \"{updateBatPath}\""); diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 4502b628..15a5f238 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -363,9 +363,35 @@ namespace Ink_Canvas { HasNewUpdateWindow updateWindow = new HasNewUpdateWindow(currentVersion, AvailableLatestVersion, releaseDate, releaseNotes); bool? dialogResult = updateWindow.ShowDialog(); + // 声明下载结果变量 + bool isDownloadSuccessful; + // 如果窗口被关闭但没有点击按钮,视为"稍后更新" if (dialogResult != true) { LogHelper.WriteLogToFile("AutoUpdate | Update dialog closed without selection"); + + // 更新自动更新设置并保存 + Settings.Startup.IsAutoUpdate = updateWindow.IsAutoUpdateEnabled; + Settings.Startup.IsAutoUpdateWithSilence = updateWindow.IsSilentUpdateEnabled; + SaveSettingsToFile(); + + // 如果启用了静默更新,则自动下载更新 + if (Settings.Startup.IsAutoUpdateWithSilence) { + LogHelper.WriteLogToFile("AutoUpdate | Silent update enabled, downloading update automatically"); + + // 静默下载更新 + isDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion); + + if (isDownloadSuccessful) { + LogHelper.WriteLogToFile("AutoUpdate | Update downloaded successfully, will install when application closes"); + + // 启动检查定时器 + timerCheckAutoUpdateWithSilence.Start(); + } else { + LogHelper.WriteLogToFile("AutoUpdate | Silent update download failed", LogHelper.LogType.Error); + } + } + return; } @@ -374,9 +400,6 @@ namespace Ink_Canvas { Settings.Startup.IsAutoUpdateWithSilence = updateWindow.IsSilentUpdateEnabled; SaveSettingsToFile(); - // 声明下载结果变量 - bool isDownloadSuccessful; - // 根据用户选择处理更新 switch (updateWindow.Result) { case HasNewUpdateWindow.UpdateResult.UpdateNow: diff --git a/Ink Canvas/MainWindow_cs/MW_Timer.cs b/Ink Canvas/MainWindow_cs/MW_Timer.cs index bf8197c0..5c84aa62 100644 --- a/Ink Canvas/MainWindow_cs/MW_Timer.cs +++ b/Ink Canvas/MainWindow_cs/MW_Timer.cs @@ -6,6 +6,9 @@ using System.Runtime.CompilerServices; using System.Timers; using System.Windows; using MessageBox = System.Windows.MessageBox; +using System.IO; +using System.Reflection; +using System.Threading.Tasks; namespace Ink_Canvas { public class TimeViewModel : INotifyPropertyChanged { @@ -302,24 +305,102 @@ namespace Ink_Canvas { } private void timerCheckAutoUpdateWithSilence_Elapsed(object sender, ElapsedEventArgs e) { - Dispatcher.Invoke(() => { - try { - if (!Topmost || inkCanvas.Strokes.Count > 0) return; - } - catch (Exception ex) { - LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); - } - }); + // 停止计时器,避免重复触发 + timerCheckAutoUpdateWithSilence.Stop(); + try { - if (AutoUpdateWithSilenceTimeComboBox.CheckIsInSilencePeriod( - Settings.Startup.AutoUpdateWithSilenceStartTime, - Settings.Startup.AutoUpdateWithSilenceEndTime)) { + // 检查是否有可用的更新 + if (string.IsNullOrEmpty(AvailableLatestVersion)) { + LogHelper.WriteLogToFile("AutoUpdate | No available update version found"); + return; + } + + // 检查是否启用了静默更新 + if (!Settings.Startup.IsAutoUpdateWithSilence) { + LogHelper.WriteLogToFile("AutoUpdate | Silent update is disabled"); + return; + } + + // 检查更新文件是否已下载 + string updatesFolderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "AutoUpdate"); + string statusFilePath = Path.Combine(updatesFolderPath, $"DownloadV{AvailableLatestVersion}Status.txt"); + + if (!File.Exists(statusFilePath) || File.ReadAllText(statusFilePath).Trim().ToLower() != "true") { + LogHelper.WriteLogToFile("AutoUpdate | Update file not downloaded yet"); + + // 尝试下载更新文件 + Task.Run(async () => { + bool isDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion); + if (isDownloadSuccessful) { + LogHelper.WriteLogToFile("AutoUpdate | Update downloaded successfully, will check again for installation"); + // 重新启动计时器,下次检查时安装 + timerCheckAutoUpdateWithSilence.Start(); + } else { + LogHelper.WriteLogToFile("AutoUpdate | Failed to download update", LogHelper.LogType.Error); + } + }); + + return; + } + + // 检查是否在静默更新时间段内 + bool isInSilencePeriod = AutoUpdateWithSilenceTimeComboBox.CheckIsInSilencePeriod( + Settings.Startup.AutoUpdateWithSilenceStartTime, + Settings.Startup.AutoUpdateWithSilenceEndTime); + + if (!isInSilencePeriod) { + LogHelper.WriteLogToFile("AutoUpdate | Not in silence update time period"); + // 重新启动计时器,稍后再检查 + timerCheckAutoUpdateWithSilence.Start(); + return; + } + + // 检查应用程序状态,确保可以安全更新 + bool canSafelyUpdate = false; + + Dispatcher.Invoke(() => { + try { + // 检查是否处于桌面模式(Topmost为true)且没有墨迹内容 + if (Topmost && inkCanvas.Strokes.Count == 0) { + // 检查是否有未保存的内容或正在进行的操作 + if (!isHidingSubPanelsWhenInking) { + canSafelyUpdate = true; + LogHelper.WriteLogToFile("AutoUpdate | Application is in a safe state for update"); + } else { + LogHelper.WriteLogToFile("AutoUpdate | Application is currently performing operations"); + } + } else { + LogHelper.WriteLogToFile("AutoUpdate | Application has unsaved content or is not in desktop mode"); + } + } + catch (Exception ex) { + LogHelper.WriteLogToFile($"AutoUpdate | Error checking application state: {ex.Message}", LogHelper.LogType.Error); + } + }); + + if (canSafelyUpdate) { + LogHelper.WriteLogToFile("AutoUpdate | Installing update now"); + + // 设置为用户主动退出,避免被看门狗判定为崩溃 + App.IsAppExitByUser = true; + + // 执行更新安装 AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, true); - timerCheckAutoUpdateWithSilence.Stop(); + + // 关闭应用程序 + Dispatcher.Invoke(() => { + Application.Current.Shutdown(); + }); + } else { + LogHelper.WriteLogToFile("AutoUpdate | Cannot safely update now, will try again later"); + // 重新启动计时器,稍后再检查 + timerCheckAutoUpdateWithSilence.Start(); } } catch (Exception ex) { - LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); + LogHelper.WriteLogToFile($"AutoUpdate | Error in silent update check: {ex.Message}", LogHelper.LogType.Error); + // 出错时重新启动计时器,稍后再检查 + timerCheckAutoUpdateWithSilence.Start(); } } }