From 27d683a7cc333f7bed8ea3b4aa0db7ca80a1ceb4 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 6 Sep 2025 21:26:46 +0800 Subject: [PATCH] =?UTF-8?q?improve:PPT=E5=8F=8A=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/AutoUpdateHelper.cs | 26 +++++++ Ink Canvas/MainWindow.xaml | 21 +++++ Ink Canvas/MainWindow.xaml.cs | 76 +++++++++++++++++++ Ink Canvas/MainWindow_cs/MW_PPT.cs | 3 + Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 11 +++ Ink Canvas/Resources/Settings.cs | 8 ++ 6 files changed, 145 insertions(+) diff --git a/Ink Canvas/Helpers/AutoUpdateHelper.cs b/Ink Canvas/Helpers/AutoUpdateHelper.cs index abaef2d6..8db4fb88 100644 --- a/Ink Canvas/Helpers/AutoUpdateHelper.cs +++ b/Ink Canvas/Helpers/AutoUpdateHelper.cs @@ -1610,12 +1610,24 @@ namespace Ink_Canvas.Helpers Directory.CreateDirectory(destinationDir); } + // 定义需要覆盖的文件列表(仅覆盖主程序和配置文件) + string[] filesToOverwrite = { "InkCanvasForClass.exe", "InkCanvasForClass.exe.config" }; + // 复制文件 foreach (FileInfo file in dir.GetFiles()) { + // 只覆盖指定的文件,跳过其他文件 + if (!filesToOverwrite.Contains(file.Name)) + { + LogHelper.WriteLogToFile($"AutoUpdate | 跳过文件(不在覆盖列表中): {file.Name}"); + continue; + } + string targetFilePath = Path.Combine(destinationDir, file.Name); bool fileCopied = false; + LogHelper.WriteLogToFile($"AutoUpdate | 开始覆盖文件: {file.Name}"); + // 重试机制,最多重试3次 for (int retry = 0; retry < 3; retry++) { @@ -1641,6 +1653,7 @@ namespace Ink_Canvas.Helpers await Task.Run(() => file.CopyTo(targetFilePath)); fileCopied = true; + LogHelper.WriteLogToFile($"AutoUpdate | 文件覆盖成功: {file.Name}"); break; } catch (Exception ex) @@ -1687,12 +1700,24 @@ namespace Ink_Canvas.Helpers Directory.CreateDirectory(destinationDir); } + // 定义需要覆盖的文件列表(仅覆盖主程序和配置文件) + string[] filesToOverwrite = { "InkCanvasForClass.exe", "InkCanvasForClass.exe.config" }; + // 复制文件 foreach (FileInfo file in dir.GetFiles()) { + // 只覆盖指定的文件,跳过其他文件 + if (!filesToOverwrite.Contains(file.Name)) + { + LogHelper.WriteLogToFile($"AutoUpdate | 跳过文件(不在覆盖列表中): {file.Name}"); + continue; + } + string targetFilePath = Path.Combine(destinationDir, file.Name); try { + LogHelper.WriteLogToFile($"AutoUpdate | 开始覆盖文件: {file.Name}"); + // 如果目标文件存在且正在使用,先删除 if (File.Exists(targetFilePath)) { @@ -1700,6 +1725,7 @@ namespace Ink_Canvas.Helpers } await Task.Run(() => file.CopyTo(targetFilePath)); + LogHelper.WriteLogToFile($"AutoUpdate | 文件覆盖成功: {file.Name}"); } catch (Exception ex) { diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index ee799c1e..d918730f 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -531,6 +531,27 @@ + + + + + + + 选择软件运行模式。仅PPT模式下,软件将完全隐藏,仅在PPT放映时出现。 + + + + + + + + + /// 模式切换开关事件处理 + /// + private void ToggleSwitchMode_Toggled(object sender, RoutedEventArgs e) + { + try + { + var toggle = sender as iNKORE.UI.WPF.Modern.Controls.ToggleSwitch; + if (toggle != null) + { + Settings.ModeSettings.IsPPTOnlyMode = toggle.IsOn; + + // 如果切换到仅PPT模式,立即隐藏主窗口 + if (Settings.ModeSettings.IsPPTOnlyMode) + { + Hide(); + LogHelper.WriteLogToFile("已切换到仅PPT模式,主窗口已隐藏", LogHelper.LogType.Event); + } + else + { + // 如果切换到正常模式,显示主窗口 + Show(); + LogHelper.WriteLogToFile("已切换到正常模式,主窗口已显示", LogHelper.LogType.Event); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"切换模式时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 检查是否应该显示主窗口(基于PPT模式和PPT放映状态) + /// + private void CheckMainWindowVisibility() + { + try + { + if (Settings.ModeSettings.IsPPTOnlyMode) + { + // 仅PPT模式下,只有在PPT放映时才显示 + bool isInSlideShow = BtnPPTSlideShowEnd.Visibility == Visibility.Visible; + if (isInSlideShow && !IsVisible) + { + Show(); + LogHelper.WriteLogToFile("PPT放映开始,显示主窗口(仅PPT模式)", LogHelper.LogType.Trace); + } + else if (!isInSlideShow && IsVisible) + { + Hide(); + LogHelper.WriteLogToFile("PPT放映结束,隐藏主窗口(仅PPT模式)", LogHelper.LogType.Trace); + } + } + else + { + // 正常模式下,确保主窗口可见 + if (!IsVisible) + { + Show(); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"检查主窗口可见性时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + #endregion } } diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index db19dd51..7a9c77c0 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -585,6 +585,9 @@ namespace Ink_Canvas { LogHelper.WriteLogToFile("PPT放映状态变化:退出放映模式", LogHelper.LogType.Trace); } + + // 检查主窗口可见性(用于仅PPT模式) + CheckMainWindowVisibility(); }); } catch (Exception ex) diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 111a4bce..2ce687d5 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -786,6 +786,17 @@ namespace Ink_Canvas ToggleSwitchDirectCallCiRand.IsOn = Settings.RandSettings.DirectCallCiRand; } + // ModeSettings + if (Settings.ModeSettings != null) + { + ToggleSwitchMode.IsOn = Settings.ModeSettings.IsPPTOnlyMode; + } + else + { + Settings.ModeSettings = new ModeSettings(); + ToggleSwitchMode.IsOn = false; + } + // Automation if (Settings.Automation != null) { diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 13dbfe64..9b6c8b5c 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -25,6 +25,8 @@ namespace Ink_Canvas public Startup Startup { get; set; } = new Startup(); [JsonProperty("randSettings")] public RandSettings RandSettings { get; set; } = new RandSettings(); + [JsonProperty("modeSettings")] + public ModeSettings ModeSettings { get; set; } = new ModeSettings(); } public class Canvas @@ -584,4 +586,10 @@ namespace Ink_Canvas // 用于JSON序列化 public CustomFloatingBarIcon() { } } + + public class ModeSettings + { + [JsonProperty("isPPTOnlyMode")] + public bool IsPPTOnlyMode { get; set; } = false; // 是否为仅PPT模式,默认为false(正常模式) + } }