From a1c4d53d7c950ca1f06cc6b9ffea61057eabbcde Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 10 Jan 2026 21:00:45 +0800 Subject: [PATCH] =?UTF-8?q?add:PPT=E8=81=94=E5=8A=A8=E5=A4=87=E7=94=A8?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/PPTManager.cs | 152 ++++++++++--------------------- 1 file changed, 50 insertions(+), 102 deletions(-) diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs index 5d3d3ae2..dd7c5c70 100644 --- a/Ink Canvas/Helpers/PPTManager.cs +++ b/Ink Canvas/Helpers/PPTManager.cs @@ -296,78 +296,52 @@ namespace Ink_Canvas.Helpers var hr = (uint)ex.HResult; if (hr == 0x800401E3 || hr == 0x800401F3 || hr == 0x800401E4) { - LogHelper.WriteLogToFile($"检测到 COM 注册损坏 (HR: 0x{hr:X8}),等待 10 秒后重试", LogHelper.LogType.Warning); - Thread.Sleep(10000); - - try - { - var pptApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application"); - if (pptApp != null && Marshal.IsComObject(pptApp)) - { - var _ = pptApp.Name; - LogHelper.WriteLogToFile("等待后常规连接方法成功", LogHelper.LogType.Event); - return pptApp; - } - } - catch - { - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToPowerPointViaROT(); - } - - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToPowerPointViaROT(); + LogHelper.WriteLogToFile($"检测到 COM 注册损坏 (HR: 0x{hr:X8}),持续尝试常规方法 10 秒", LogHelper.LogType.Warning); + return TryConnectToPowerPointWithRetry(); } return null; } catch (InvalidCastException) { - LogHelper.WriteLogToFile("COM 对象类型转换失败,等待 10 秒后重试", LogHelper.LogType.Warning); - Thread.Sleep(10000); - - try - { - var pptApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application"); - if (pptApp != null && Marshal.IsComObject(pptApp)) - { - var _ = pptApp.Name; - LogHelper.WriteLogToFile("等待后常规连接方法成功", LogHelper.LogType.Event); - return pptApp; - } - } - catch - { - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToPowerPointViaROT(); - } - - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToPowerPointViaROT(); + LogHelper.WriteLogToFile("COM 对象类型转换失败,持续尝试常规方法 10 秒", LogHelper.LogType.Warning); + return TryConnectToPowerPointWithRetry(); } catch (Exception ex) { - LogHelper.WriteLogToFile($"常规连接方法失败: {ex.Message},等待 10 秒后重试", LogHelper.LogType.Warning); - Thread.Sleep(10000); - + LogHelper.WriteLogToFile($"常规连接方法失败: {ex.Message},持续尝试常规方法 10 秒", LogHelper.LogType.Warning); + return TryConnectToPowerPointWithRetry(); + } + } + + private Microsoft.Office.Interop.PowerPoint.Application TryConnectToPowerPointWithRetry() + { + DateTime startTime = DateTime.Now; + TimeSpan timeout = TimeSpan.FromSeconds(10); + int attemptCount = 0; + + while (DateTime.Now - startTime < timeout) + { try { + attemptCount++; var pptApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application"); + if (pptApp != null && Marshal.IsComObject(pptApp)) { var _ = pptApp.Name; - LogHelper.WriteLogToFile("等待后常规连接方法成功", LogHelper.LogType.Event); + LogHelper.WriteLogToFile($"常规连接方法在第 {attemptCount} 次尝试后成功", LogHelper.LogType.Event); return pptApp; } } catch { - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToPowerPointViaROT(); } - - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToPowerPointViaROT(); + + Thread.Sleep(500); } + + LogHelper.WriteLogToFile($"10 秒内常规连接方法失败(共尝试 {attemptCount} 次),尝试使用 ROT 备用方法", LogHelper.LogType.Warning); + return TryConnectToPowerPointViaROT(); } private Microsoft.Office.Interop.PowerPoint.Application TryConnectToPowerPointViaROT() @@ -413,27 +387,8 @@ namespace Ink_Canvas.Helpers var hr = (uint)ex.HResult; if (hr == 0x800401E3 || hr == 0x800401F3 || hr == 0x800401E4) { - LogHelper.WriteLogToFile($"检测到 WPS COM 注册损坏 (HR: 0x{hr:X8}),等待 10 秒后重试", LogHelper.LogType.Warning); - Thread.Sleep(10000); - - try - { - var wpsApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("kwpp.Application"); - if (wpsApp != null && Marshal.IsComObject(wpsApp)) - { - var _ = wpsApp.Name; - LogHelper.WriteLogToFile("等待后常规连接方法成功", LogHelper.LogType.Event); - return wpsApp; - } - } - catch - { - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToWPSViaROT(); - } - - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToWPSViaROT(); + LogHelper.WriteLogToFile($"检测到 WPS COM 注册损坏 (HR: 0x{hr:X8}),持续尝试常规方法 10 秒", LogHelper.LogType.Warning); + return TryConnectToWPSWithRetry(); } if (hr != 0x80004005 && hr != 0x800706B5 && hr != 0x8001010E) { @@ -443,52 +398,45 @@ namespace Ink_Canvas.Helpers } catch (InvalidCastException) { - LogHelper.WriteLogToFile("WPS COM 对象类型转换失败,等待 10 秒后重试", LogHelper.LogType.Warning); - Thread.Sleep(10000); - - try - { - var wpsApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("kwpp.Application"); - if (wpsApp != null && Marshal.IsComObject(wpsApp)) - { - var _ = wpsApp.Name; - LogHelper.WriteLogToFile("等待后常规连接方法成功", LogHelper.LogType.Event); - return wpsApp; - } - } - catch - { - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToWPSViaROT(); - } - - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToWPSViaROT(); + LogHelper.WriteLogToFile("WPS COM 对象类型转换失败,持续尝试常规方法 10 秒", LogHelper.LogType.Warning); + return TryConnectToWPSWithRetry(); } catch (Exception ex) { - LogHelper.WriteLogToFile($"连接WPS时发生意外错误: {ex},等待 10 秒后重试", LogHelper.LogType.Warning); - Thread.Sleep(10000); - + LogHelper.WriteLogToFile($"连接WPS时发生意外错误: {ex},持续尝试常规方法 10 秒", LogHelper.LogType.Warning); + return TryConnectToWPSWithRetry(); + } + } + + private Microsoft.Office.Interop.PowerPoint.Application TryConnectToWPSWithRetry() + { + DateTime startTime = DateTime.Now; + TimeSpan timeout = TimeSpan.FromSeconds(10); + int attemptCount = 0; + + while (DateTime.Now - startTime < timeout) + { try { + attemptCount++; var wpsApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("kwpp.Application"); + if (wpsApp != null && Marshal.IsComObject(wpsApp)) { var _ = wpsApp.Name; - LogHelper.WriteLogToFile("等待后常规连接方法成功", LogHelper.LogType.Event); + LogHelper.WriteLogToFile($"WPS 常规连接方法在第 {attemptCount} 次尝试后成功", LogHelper.LogType.Event); return wpsApp; } } catch { - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToWPSViaROT(); } - - LogHelper.WriteLogToFile("等待后常规连接方法仍然失败,尝试使用 ROT 备用方法", LogHelper.LogType.Warning); - return TryConnectToWPSViaROT(); + + Thread.Sleep(500); } + + LogHelper.WriteLogToFile($"10 秒内 WPS 常规连接方法失败(共尝试 {attemptCount} 次),尝试使用 ROT 备用方法", LogHelper.LogType.Warning); + return TryConnectToWPSViaROT(); } private Microsoft.Office.Interop.PowerPoint.Application TryConnectToWPSViaROT()