From 98663422b14e5af4dbd2b0eb991f0079e54305d7 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 13 Sep 2025 19:29:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/MultiPPTInkManager.cs | 55 +++++++++++++++---- Ink Canvas/Helpers/PPTInkManager.cs | 34 +++++++++--- Ink Canvas/Helpers/PPTManager.cs | 34 ++---------- Ink Canvas/Helpers/PPTUIManager.cs | 2 - Ink Canvas/MainWindow_cs/MW_PPT.cs | 11 +++- .../Windows/CountdownTimerWindow.xaml.cs | 1 - 6 files changed, 86 insertions(+), 51 deletions(-) diff --git a/Ink Canvas/Helpers/MultiPPTInkManager.cs b/Ink Canvas/Helpers/MultiPPTInkManager.cs index ac3d7e47..242d0c6d 100644 --- a/Ink Canvas/Helpers/MultiPPTInkManager.cs +++ b/Ink Canvas/Helpers/MultiPPTInkManager.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; using System.Windows.Ink; @@ -78,7 +79,7 @@ namespace Ink_Canvas.Helpers // 设置为当前活跃的演示文稿 _currentActivePresentationId = presentationId; - LogHelper.WriteLogToFile($"已初始化多PPT墨迹管理: {presentation.Name} (ID: {presentationId})", LogHelper.LogType.Event); + LogHelper.WriteLogToFile($"已初始化多PPT墨迹管理: {presentation.Name}, 幻灯片数量: {presentation.Slides.Count}", LogHelper.LogType.Event); } catch (Exception ex) { @@ -127,7 +128,10 @@ namespace Ink_Canvas.Helpers _presentationInfos[presentationId].LastAccessTime = DateTime.Now; } - LogHelper.WriteLogToFile($"已切换到演示文稿: {presentation.Name} (ID: {presentationId})", LogHelper.LogType.Trace); + if (_currentActivePresentationId != presentationId) + { + LogHelper.WriteLogToFile($"已切换到演示文稿: {presentation.Name}", LogHelper.LogType.Trace); + } return true; } else @@ -445,11 +449,17 @@ namespace Ink_Canvas.Helpers _currentActivePresentationId = ""; } - LogHelper.WriteLogToFile($"已移除演示文稿管理器: {presentation.Name}", LogHelper.LogType.Trace); + LogHelper.WriteLogToFile($"已移除演示文稿管理器: {presentationId}", LogHelper.LogType.Trace); } - catch (Exception ex) + catch (COMException comEx) + { + var hr = (uint)comEx.HResult; + if (hr == 0x8001010E || hr == 0x80004005 || hr == 0x800706BA || hr == 0x800706BE || hr == 0x80048010) + { + } + } + catch (Exception) { - LogHelper.WriteLogToFile($"移除演示文稿管理器失败: {ex}", LogHelper.LogType.Error); } } } @@ -546,14 +556,28 @@ namespace Ink_Canvas.Helpers { try { + // 检查COM对象是否仍然有效 + if (presentation == null) + { + return $"invalid_{DateTime.Now.Ticks}"; + } + var presentationPath = presentation.FullName; var fileHash = GetFileHash(presentationPath); var processId = GetProcessId(presentation); return $"{presentation.Name}_{presentation.Slides.Count}_{fileHash}_{processId}"; } - catch (Exception ex) + catch (COMException comEx) + { + var hr = (uint)comEx.HResult; + if (hr == 0x8001010E || hr == 0x80004005 || hr == 0x800706BA || hr == 0x800706BE || hr == 0x80048010) + { + return $"disconnected_{DateTime.Now.Ticks}"; + } + return $"error_{DateTime.Now.Ticks}"; + } + catch (Exception) { - LogHelper.WriteLogToFile($"生成演示文稿ID失败: {ex}", LogHelper.LogType.Error); return $"unknown_{DateTime.Now.Ticks}"; } } @@ -570,9 +594,9 @@ namespace Ink_Canvas.Helpers return BitConverter.ToString(hashBytes).Replace("-", "").Substring(0, 8); } } - catch (Exception ex) + catch (Exception) { - LogHelper.WriteLogToFile($"计算文件哈希值失败: {ex}", LogHelper.LogType.Error); + // 所有异常都静默处理,避免日志噪音 return "error"; } } @@ -593,9 +617,18 @@ namespace Ink_Canvas.Helpers } return "unknown"; } - catch (Exception ex) + catch (COMException comEx) + { + // COM对象已失效,这是正常情况,完全静默处理 + var hr = (uint)comEx.HResult; + if (hr == 0x8001010E || hr == 0x80004005 || hr == 0x800706BA || hr == 0x800706BE || hr == 0x80048010) + { + return "disconnected"; + } + return "error"; + } + catch (Exception) { - LogHelper.WriteLogToFile($"获取进程ID失败: {ex}", LogHelper.LogType.Error); return "error"; } } diff --git a/Ink Canvas/Helpers/PPTInkManager.cs b/Ink Canvas/Helpers/PPTInkManager.cs index e6cee093..dbcc4cdb 100644 --- a/Ink Canvas/Helpers/PPTInkManager.cs +++ b/Ink Canvas/Helpers/PPTInkManager.cs @@ -100,10 +100,13 @@ namespace Ink_Canvas.Helpers { try { - // 检查墨迹锁定 + // 检查墨迹锁定 if (!CanWriteInk(slideIndex)) { - LogHelper.WriteLogToFile($"墨迹写入被锁定,当前页:{slideIndex},锁定页:{_lockedSlideIndex}", LogHelper.LogType.Warning); + if (DateTime.Now < _inkLockUntil) + { + LogHelper.WriteLogToFile($"墨迹写入被锁定,当前页:{slideIndex},锁定页:{_lockedSlideIndex}", LogHelper.LogType.Warning); + } return; } @@ -117,7 +120,10 @@ namespace Ink_Canvas.Helpers _memoryStreams[slideIndex]?.Dispose(); _memoryStreams[slideIndex] = ms; - LogHelper.WriteLogToFile($"已保存第{slideIndex}页墨迹,大小: {ms.Length} bytes", LogHelper.LogType.Trace); + if (ms.Length > 0) + { + LogHelper.WriteLogToFile($"已保存第{slideIndex}页墨迹,大小: {ms.Length} bytes", LogHelper.LogType.Trace); + } } } catch (Exception ex) @@ -215,7 +221,10 @@ namespace Ink_Canvas.Helpers _lastSwitchTime = now; _lastSwitchSlideIndex = slideIndex; - LogHelper.WriteLogToFile($"已切换到第{slideIndex}页,加载墨迹数量: {newStrokes.Count}", LogHelper.LogType.Trace); + if (newStrokes.Count > 0) + { + LogHelper.WriteLogToFile($"已切换到第{slideIndex}页,加载墨迹数量: {newStrokes.Count}", LogHelper.LogType.Trace); + } return newStrokes; } @@ -386,9 +395,20 @@ namespace Ink_Canvas.Helpers /// public bool CanWriteInk(int currentSlideIndex) { - if (DateTime.Now < _inkLockUntil) return false; - if (currentSlideIndex != _lockedSlideIndex && _lockedSlideIndex > 0) return false; - return true; + // 如果锁定时间已过,允许写入 + if (DateTime.Now >= _inkLockUntil) + { + return true; + } + + // 如果当前页面与锁定页面相同,允许写入(用户在当前页面绘制) + if (currentSlideIndex == _lockedSlideIndex) + { + return true; + } + + // 只有在快速切换且页面不同时才锁定 + return false; } /// diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index b0951a34..7e117680 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -277,16 +277,6 @@ namespace Ink_Canvas.Helpers catch (COMException ex) { var hr = (uint)ex.HResult; - // 忽略常见的PowerPoint连接错误: - // 0x800401E3: 操作无法使用 - // 0x80004005: 未指定错误 - // 0x800706B5: RPC服务器不可用 - // 0x8001010E: 应用程序调用一个已为另一线程整理的接口 - // 0x800401F3: 无效的类字符串(PowerPoint未安装或COM组件未注册) - if (hr != 0x800401E3 && hr != 0x80004005 && hr != 0x800706B5 && hr != 0x8001010E && hr != 0x800401F3) - { - LogHelper.WriteLogToFile($"连接PowerPoint失败: {ex}", LogHelper.LogType.Warning); - } return null; } catch (InvalidCastException) @@ -294,9 +284,8 @@ namespace Ink_Canvas.Helpers // COM对象类型转换失败 return null; } - catch (Exception ex) + catch (Exception) { - LogHelper.WriteLogToFile($"连接PowerPoint时发生意外错误: {ex}", LogHelper.LogType.Warning); return null; } } @@ -422,12 +411,7 @@ namespace Ink_Canvas.Helpers } catch (COMException comEx) { - // COM对象已经被释放或在错误的线程中,忽略这些错误 var hr = (uint)comEx.HResult; - if (hr != 0x8001010E && hr != 0x80004005 && hr != 0x800706B5) - { - LogHelper.WriteLogToFile($"取消PPT事件注册COM异常: {comEx}", LogHelper.LogType.Warning); - } } catch (InvalidCastException) { @@ -437,10 +421,8 @@ namespace Ink_Canvas.Helpers }, DispatcherPriority.Normal, CancellationToken.None, TimeSpan.FromSeconds(1)); } } - catch (Exception ex) + catch (Exception) { - // 记录但不抛出异常,确保清理过程能够继续 - LogHelper.WriteLogToFile($"取消PPT事件注册失败: {ex.GetType().Name} - {ex.Message}", LogHelper.LogType.Warning); } // 释放COM对象 @@ -451,9 +433,8 @@ namespace Ink_Canvas.Helpers Marshal.ReleaseComObject(CurrentSlide); } } - catch (Exception ex) + catch (Exception) { - LogHelper.WriteLogToFile($"释放CurrentSlide COM对象失败: {ex}", LogHelper.LogType.Warning); } try @@ -463,9 +444,8 @@ namespace Ink_Canvas.Helpers Marshal.ReleaseComObject(CurrentSlides); } } - catch (Exception ex) + catch (Exception) { - LogHelper.WriteLogToFile($"释放CurrentSlides COM对象失败: {ex}", LogHelper.LogType.Warning); } try @@ -475,9 +455,8 @@ namespace Ink_Canvas.Helpers Marshal.ReleaseComObject(CurrentPresentation); } } - catch (Exception ex) + catch (Exception) { - LogHelper.WriteLogToFile($"释放CurrentPresentation COM对象失败: {ex}", LogHelper.LogType.Warning); } try @@ -487,9 +466,8 @@ namespace Ink_Canvas.Helpers Marshal.ReleaseComObject(PPTApplication); } } - catch (Exception ex) + catch (Exception) { - LogHelper.WriteLogToFile($"释放PPTApplication COM对象失败: {ex}", LogHelper.LogType.Warning); } // 清理引用 diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index 8a956f58..5ac2472d 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -86,7 +86,6 @@ namespace Ink_Canvas.Helpers { _mainWindow.PPTBtnPageNow.Text = currentSlide.ToString(); _mainWindow.PPTBtnPageTotal.Text = $"/ {totalSlides}"; - LogHelper.WriteLogToFile($"更新PPT页码显示: {currentSlide}/{totalSlides}", LogHelper.LogType.Trace); } else { @@ -127,7 +126,6 @@ namespace Ink_Canvas.Helpers { _mainWindow.PPTBtnPageNow.Text = currentSlide.ToString(); _mainWindow.PPTBtnPageTotal.Text = $"/ {totalSlides}"; - LogHelper.WriteLogToFile($"更新PPT页码显示: {currentSlide}/{totalSlides}", LogHelper.LogType.Trace); } else { diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 5b154fce..464f2a36 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -578,9 +578,16 @@ namespace Ink_Canvas _pptUIManager?.UpdateConnectionStatus(false); }); } - catch (Exception ex) + catch (COMException comEx) + { + // COM对象已失效,这是正常情况,完全静默处理 + var hr = (uint)comEx.HResult; + if (hr == 0x8001010E || hr == 0x80004005 || hr == 0x800706BA || hr == 0x800706BE || hr == 0x80048010) + { + } + } + catch (Exception) { - LogHelper.WriteLogToFile($"处理演示文稿关闭事件失败: {ex}", LogHelper.LogType.Error); } } diff --git a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs index a956aff1..a90e6b1d 100644 --- a/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs +++ b/Ink Canvas/Windows/CountdownTimerWindow.xaml.cs @@ -222,7 +222,6 @@ namespace Ink_Canvas BtnStartCover.Visibility = Visibility.Collapsed; BorderStopTime.Visibility = Visibility.Collapsed; TextBlockHour.Foreground = new SolidColorBrush(StringToColor("#FF5B5D5F")); - return; } else if (isTimerRunning && isPaused) {