From 6c075d80ba83c56c95688b9436682425dd34c0d1 Mon Sep 17 00:00:00 2001 From: unknown <2564608840@qq.com> Date: Sun, 20 Jul 2025 12:36:21 +0800 Subject: [PATCH] improve:issue #5 --- Ink Canvas/MainWindow_cs/MW_PPT.cs | 90 +++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 7 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs index d386dbef..bb1e4358 100644 --- a/Ink Canvas/MainWindow_cs/MW_PPT.cs +++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs @@ -85,9 +85,10 @@ namespace Ink_Canvas { public static bool IsShowingRestoreHiddenSlidesWindow = false; private static bool IsShowingAutoplaySlidesWindow = false; - // WPS 相关变量 - private static Process wpsProcess = null; - private static bool hasWpsProcessID = false; + // WPP 相关变量 + private static Process wppProcess = null; + private static bool hasWppProcessID = false; + private static System.Timers.Timer wppProcessCheckTimer = null; private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e) { @@ -549,13 +550,14 @@ namespace Ink_Canvas { try { if (isFloatingBarFolded) await UnFoldFloatingBar(new object()); - // 对于延迟未关闭的 WPP,先记录进程 ID,待所有结束事件处理完毕后强制关闭 - if (pptApplication != null && pptApplication.Path.Contains("Kingsoft\\WPS Office\\") && pptApplication.Presentations.Count <= 1) + // 记录 WPP 进程 ID,用于后续检测未关闭的进程 + if (pptApplication != null && pptApplication.Path.Contains("Kingsoft\\WPS Office\\")) { uint processId; GetWindowThreadProcessId((IntPtr)pptApplication.HWND, out processId); - wpsProcess = Process.GetProcessById((int)processId); - hasWpsProcessID = true; + wppProcess = Process.GetProcessById((int)processId); + hasWppProcessID = true; + LogHelper.WriteLogToFile($"记录 WPP 进程 ID: {processId}", LogHelper.LogType.Trace); } LogHelper.WriteLogToFile(string.Format("PowerPoint Slide Show End"), LogHelper.LogType.Event); @@ -646,6 +648,12 @@ namespace Ink_Canvas { await Application.Current.Dispatcher.InvokeAsync(() => { ViewboxFloatingBarMarginAnimation(100, true); }); + + // 启动 WPP 进程检测定时器 + if (hasWppProcessID && wppProcess != null) + { + StartWppProcessCheckTimer(); + } } catch (Exception ex) { LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error); @@ -1000,5 +1008,73 @@ namespace Ink_Canvas { private void ImagePPTControlEnd_MouseUp(object sender, MouseButtonEventArgs e) { BtnPPTSlideShowEnd_Click(BtnPPTSlideShowEnd, null); } + + private void StartWppProcessCheckTimer() + { + if (wppProcessCheckTimer != null) + { + wppProcessCheckTimer.Stop(); + wppProcessCheckTimer.Dispose(); + } + + wppProcessCheckTimer = new System.Timers.Timer(2000); // 2秒检查一次 + wppProcessCheckTimer.Elapsed += WppProcessCheckTimer_Elapsed; + wppProcessCheckTimer.Start(); + LogHelper.WriteLogToFile("启动 WPP 进程检测定时器", LogHelper.LogType.Trace); + } + + private void WppProcessCheckTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + try + { + if (wppProcess == null || hasWppProcessID == false) + { + StopWppProcessCheckTimer(); + return; + } + + // 刷新进程状态 + wppProcess.Refresh(); + + if (wppProcess.HasExited) + { + LogHelper.WriteLogToFile("WPP 进程已正常关闭", LogHelper.LogType.Trace); + StopWppProcessCheckTimer(); + } + else + { + // 检查是否超过 5 秒仍未关闭 + var processStartTime = wppProcess.StartTime; + var timeSinceStart = DateTime.Now - processStartTime; + + if (timeSinceStart.TotalSeconds > 5) + { + LogHelper.WriteLogToFile("检测到长时间未关闭的 WPP 进程,开始强制关闭", LogHelper.LogType.Event); + wppProcess.Kill(); + LogHelper.WriteLogToFile("强制关闭 WPP 进程成功", LogHelper.LogType.Event); + StopWppProcessCheckTimer(); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"WPP 进程检测失败: {ex.ToString()}", LogHelper.LogType.Error); + StopWppProcessCheckTimer(); + } + } + + private void StopWppProcessCheckTimer() + { + if (wppProcessCheckTimer != null) + { + wppProcessCheckTimer.Stop(); + wppProcessCheckTimer.Dispose(); + wppProcessCheckTimer = null; + } + + wppProcess = null; + hasWppProcessID = false; + LogHelper.WriteLogToFile("停止 WPP 进程检测定时器", LogHelper.LogType.Trace); + } } }