From 44278d68b4e791abcc84cc1eec055aff4b363779 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 23 Aug 2025 19:10:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=BF=BB=E9=A1=B5=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E4=B8=8D=E5=90=88=E7=90=86=E7=9A=84=E6=98=BE=E7=A4=BA=E6=97=B6?= =?UTF-8?q?=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/PPTManager.cs | 46 ++++++++++++++++++++++++++++++ Ink Canvas/Helpers/PPTUIManager.cs | 29 ++++++++++++++++++- Ink Canvas/MainWindow_cs/MW_PPT.cs | 27 ++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index 1a2d5a90..c51fa589 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -25,6 +25,7 @@ namespace Ink_Canvas.Helpers public event Action PresentationOpen; public event Action PresentationClose; public event Action PPTConnectionChanged; + public event Action SlideShowStateChanged; #endregion #region Properties @@ -92,6 +93,7 @@ namespace Ink_Canvas.Helpers #region Private Fields private Timer _connectionCheckTimer; + private Timer _slideShowStateCheckTimer; private Timer _wpsProcessCheckTimer; private Process _wpsProcess; private bool _hasWpsProcessId; @@ -99,6 +101,7 @@ namespace Ink_Canvas.Helpers private int _wpsProcessCheckCount; private WpsWindowInfo _lastForegroundWpsWindow; private DateTime _lastWindowCheckTime = DateTime.MinValue; + private bool _lastSlideShowState = false; private readonly object _lockObject = new object(); private bool _disposed = false; #endregion @@ -114,6 +117,10 @@ namespace Ink_Canvas.Helpers _connectionCheckTimer = new Timer(500); _connectionCheckTimer.Elapsed += OnConnectionCheckTimerElapsed; _connectionCheckTimer.AutoReset = true; + + _slideShowStateCheckTimer = new Timer(1000); + _slideShowStateCheckTimer.Elapsed += OnSlideShowStateCheckTimerElapsed; + _slideShowStateCheckTimer.AutoReset = true; } public void StartMonitoring() @@ -121,6 +128,7 @@ namespace Ink_Canvas.Helpers if (!_disposed) { _connectionCheckTimer?.Start(); + _slideShowStateCheckTimer?.Start(); LogHelper.WriteLogToFile("PPT监控已启动", LogHelper.LogType.Trace); } } @@ -128,6 +136,7 @@ namespace Ink_Canvas.Helpers public void StopMonitoring() { _connectionCheckTimer?.Stop(); + _slideShowStateCheckTimer?.Stop(); DisconnectFromPPT(); LogHelper.WriteLogToFile("PPT监控已停止", LogHelper.LogType.Trace); } @@ -146,6 +155,18 @@ namespace Ink_Canvas.Helpers } } + private void OnSlideShowStateCheckTimerElapsed(object sender, ElapsedEventArgs e) + { + try + { + CheckSlideShowState(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"PPT放映状态检查失败: {ex}", LogHelper.LogType.Error); + } + } + private void CheckAndConnectToPPT() { lock (_lockObject) @@ -187,6 +208,30 @@ namespace Ink_Canvas.Helpers } } + private void CheckSlideShowState() + { + try + { + if (!IsConnected) return; + + var currentSlideShowState = IsInSlideShow; + if (currentSlideShowState != _lastSlideShowState) + { + _lastSlideShowState = currentSlideShowState; + SlideShowStateChanged?.Invoke(currentSlideShowState); + + if (!currentSlideShowState) + { + LogHelper.WriteLogToFile("检测到PPT放映已结束", LogHelper.LogType.Trace); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"检查PPT放映状态异常: {ex}", LogHelper.LogType.Error); + } + } + private Microsoft.Office.Interop.PowerPoint.Application TryConnectToPowerPoint() { try @@ -1627,6 +1672,7 @@ namespace Ink_Canvas.Helpers StopWpsProcessCheckTimer(); _connectionCheckTimer?.Dispose(); + _slideShowStateCheckTimer?.Dispose(); _wpsProcessCheckTimer?.Dispose(); _disposed = true; diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index ca235958..fd2f5add 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -3,6 +3,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Threading; +using Ink_Canvas.Helpers; namespace Ink_Canvas.Helpers { @@ -120,6 +121,29 @@ namespace Ink_Canvas.Helpers }); } + /// + /// 处理PPT放映状态变化 + /// + public void OnSlideShowStateChanged(bool isInSlideShow) + { + _dispatcher.InvokeAsync(() => + { + try + { + if (!isInSlideShow) + { + // 如果不在放映模式,隐藏所有导航面板 + HideAllNavigationPanels(); + LogHelper.WriteLogToFile("PPT放映状态变化:隐藏导航面板", LogHelper.LogType.Trace); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"处理PPT放映状态变化失败: {ex}", LogHelper.LogType.Error); + } + }); + } + /// /// 更新导航面板显示状态 /// @@ -130,7 +154,10 @@ namespace Ink_Canvas.Helpers try { // 检查是否应该显示PPT按钮 - bool shouldShowButtons = ShowPPTButton && _mainWindow.BtnPPTSlideShowEnd.Visibility == Visibility.Visible; + // 不仅要检查按钮设置,还要确保确实在PPT放映模式下 + bool shouldShowButtons = ShowPPTButton && + _mainWindow.BtnPPTSlideShowEnd.Visibility == Visibility.Visible && + _mainWindow.PPTManager?.IsInSlideShow == true; if (!shouldShowButtons) { diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index 07b2abcc..8753f03b 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -86,6 +86,11 @@ namespace Ink_Canvas private PPTManager _pptManager; private PPTInkManager _pptInkManager; private PPTUIManager _pptUIManager; + + /// + /// 获取PPT管理器实例(供UI管理器使用) + /// + public PPTManager PPTManager => _pptManager; #endregion #region PPT Manager Initialization @@ -104,6 +109,7 @@ namespace Ink_Canvas _pptManager.SlideShowEnd += OnPPTSlideShowEnd; _pptManager.PresentationOpen += OnPPTPresentationOpen; _pptManager.PresentationClose += OnPPTPresentationClose; + _pptManager.SlideShowStateChanged += OnPPTSlideShowStateChanged; // 初始化墨迹管理器 _pptInkManager = new PPTInkManager(); @@ -242,6 +248,27 @@ namespace Ink_Canvas } } + private void OnPPTSlideShowStateChanged(bool isInSlideShow) + { + try + { + Application.Current.Dispatcher.InvokeAsync(() => + { + // 通知UI管理器放映状态变化 + _pptUIManager?.OnSlideShowStateChanged(isInSlideShow); + + if (!isInSlideShow) + { + LogHelper.WriteLogToFile("PPT放映状态变化:退出放映模式", LogHelper.LogType.Trace); + } + }); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"处理PPT放映状态变化失败: {ex}", LogHelper.LogType.Error); + } + } + private async void OnPPTSlideShowBegin(SlideShowWindow wn) { try