diff --git a/Ink Canvas/Helpers/MultiPPTInkManager.cs b/Ink Canvas/Helpers/MultiPPTInkManager.cs index 96b618ed..67e4d3cb 100644 --- a/Ink Canvas/Helpers/MultiPPTInkManager.cs +++ b/Ink Canvas/Helpers/MultiPPTInkManager.cs @@ -174,14 +174,14 @@ namespace Ink_Canvas.Helpers var manager = GetCurrentManager(); if (manager != null) { - // 先创建备份 + // 保存到管理器 + manager.SaveCurrentSlideStrokes(slideIndex, strokes); + + // 只有在保存成功后才创建备份 if (!string.IsNullOrEmpty(_currentActivePresentationId)) { CreateStrokeBackup(_currentActivePresentationId, slideIndex, strokes); } - - // 保存到管理器 - manager.SaveCurrentSlideStrokes(slideIndex, strokes); // 检查是否需要执行定期备份 CheckAndPerformBackup(); diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs index 7e8afb22..9d02c79c 100644 --- a/Ink Canvas/Helpers/PPTInkManager.cs +++ b/Ink Canvas/Helpers/PPTInkManager.cs @@ -473,6 +473,13 @@ namespace Ink_Canvas.Helpers return true; } + // 如果当前页面不是锁定页面,但锁定时间很短(小于50ms),允许写入 + // 这样可以确保旧页面的墨迹能够及时保存 + if (DateTime.Now - (_inkLockUntil.AddMilliseconds(-InkLockMilliseconds)) < TimeSpan.FromMilliseconds(50)) + { + return true; + } + // 只有在快速切换且页面不同时才锁定 return false; } diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index c638914b..44cbc810 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -850,10 +850,24 @@ namespace Ink_Canvas.Helpers // 如果在放映模式,获取放映窗口的演示文稿 if (IsInSlideShow && PPTApplication.SlideShowWindows.Count > 0) { - var slideShowWindow = PPTApplication.SlideShowWindows[1]; - if (slideShowWindow?.View != null) + try { - return (Presentation)slideShowWindow.View.Slide.Parent; + var slideShowWindow = PPTApplication.SlideShowWindows[1]; + if (slideShowWindow?.View != null) + { + return (Presentation)slideShowWindow.View.Slide.Parent; + } + } + catch (COMException comEx) + { + var hr = (uint)comEx.HResult; + if (hr == 0x80048240) // Integer out of range + { + LogHelper.WriteLogToFile($"验证PPT放映窗口失败: {comEx.Message}", LogHelper.LogType.Warning); + // 放映窗口已不存在,返回null + return null; + } + throw; // 重新抛出其他COM异常 } } diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 94370fc5..8a1d0a78 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -1121,14 +1121,48 @@ namespace Ink_Canvas { try { + // 检查PPT连接状态 + if (_pptManager?.IsConnected != true || _pptManager?.IsInSlideShow != true) + { + LogHelper.WriteLogToFile($"PPT未连接或未在放映状态,跳过页面切换: IsConnected={_pptManager?.IsConnected}, IsInSlideShow={_pptManager?.IsInSlideShow}", LogHelper.LogType.Warning); + return; + } + // 获取当前页面索引 var currentSlideIndex = _pptManager?.GetCurrentSlideNumber() ?? 0; + LogHelper.WriteLogToFile($"开始切换页面墨迹: 从第{currentSlideIndex}页到第{newSlideIndex}页", LogHelper.LogType.Trace); + + // 验证页面索引的有效性 + if (newSlideIndex <= 0) + { + LogHelper.WriteLogToFile($"无效的新页面索引: {newSlideIndex},跳过页面切换", LogHelper.LogType.Warning); + return; + } + // 如果有当前墨迹且不是第一次切换,先保存到当前页面 if (inkCanvas.Strokes.Count > 0 && currentSlideIndex > 0 && currentSlideIndex != newSlideIndex) { - _multiPPTInkManager?.SaveCurrentSlideStrokes(currentSlideIndex, inkCanvas.Strokes); - LogHelper.WriteLogToFile($"切换前保存第{currentSlideIndex}页墨迹,墨迹数量: {inkCanvas.Strokes.Count}", LogHelper.LogType.Trace); + // 检查是否可以写入墨迹 + bool canWrite = _multiPPTInkManager?.CanWriteInk(currentSlideIndex) == true; + LogHelper.WriteLogToFile($"第{currentSlideIndex}页墨迹写入权限: {canWrite}", LogHelper.LogType.Trace); + + if (canWrite) + { + // 正常保存 + _multiPPTInkManager?.SaveCurrentSlideStrokes(currentSlideIndex, inkCanvas.Strokes); + LogHelper.WriteLogToFile($"正常保存第{currentSlideIndex}页墨迹,墨迹数量: {inkCanvas.Strokes.Count}", LogHelper.LogType.Trace); + } + else + { + // 墨迹被锁定,跳过保存以避免墨迹错页 + LogHelper.WriteLogToFile($"第{currentSlideIndex}页墨迹被锁定,跳过保存以避免墨迹错页", LogHelper.LogType.Warning); + } + } + else if (inkCanvas.Strokes.Count > 0 && currentSlideIndex <= 0) + { + // 无法获取当前页面索引时,不保存墨迹,直接清空 + LogHelper.WriteLogToFile($"无法获取当前页面索引({currentSlideIndex}),跳过墨迹保存", LogHelper.LogType.Warning); } // 切换到新页面并加载墨迹 @@ -1137,10 +1171,10 @@ namespace Ink_Canvas { inkCanvas.Strokes.Clear(); inkCanvas.Strokes.Add(newStrokes); + LogHelper.WriteLogToFile($"已切换到第{newSlideIndex}页,加载墨迹数量: {newStrokes.Count}", LogHelper.LogType.Trace); } - // 设置墨迹锁定 - _multiPPTInkManager?.LockInkForSlide(newSlideIndex); + // 注意:LockInkForSlide已经在SwitchToSlide中调用,这里不需要重复调用 } catch (Exception ex) {