diff --git a/Ink Canvas/Helpers/PPTManager.cs b/Ink Canvas/Helpers/PPTManager.cs
index 628820f3..b194be43 100644
--- a/Ink Canvas/Helpers/PPTManager.cs
+++ b/Ink Canvas/Helpers/PPTManager.cs
@@ -143,8 +143,8 @@ namespace Ink_Canvas.Helpers
private readonly object _lockObject = new object();
private bool _disposed;
- private Presentation _pptActivePresentation;
- private SlideShowWindow _pptSlideShowWindow;
+ private dynamic _pptActivePresentation;
+ private dynamic _pptSlideShowWindow;
private int _polling = 0;
private bool _forcePolling = false;
private bool _bindingEvents = false;
@@ -307,15 +307,15 @@ namespace Ink_Canvas.Helpers
{
try
{
- Presentation activePresentation = null;
- SlideShowWindow slideShowWindow = null;
+ dynamic activePresentation = null;
+ dynamic slideShowWindow = null;
try
{
dynamic app = PPTApplication;
activePresentation = app.ActivePresentation;
- if (activePresentation != null && !PPTROTConnectionHelper.AreComObjectsEqual(_pptActivePresentation, activePresentation))
+ if (activePresentation != null && _pptActivePresentation != null && !PPTROTConnectionHelper.AreComObjectsEqual(_pptActivePresentation, activePresentation))
{
DisconnectFromPPT();
return;
@@ -328,20 +328,32 @@ namespace Ink_Canvas.Helpers
}
catch (Exception ex)
{
- LogHelper.WriteLogToFile($"检查演示文稿状态失败: {ex}", LogHelper.LogType.Warning);
- DisconnectFromPPT();
- return;
+ LogHelper.WriteLogToFile($"检查演示文稿状态失败: {ex.Message},继续使用轮询模式", LogHelper.LogType.Warning);
+ activePresentation = null;
}
finally
{
- SafeReleaseComObject(activePresentation);
+ if (activePresentation != null && (_pptActivePresentation == null || !PPTROTConnectionHelper.AreComObjectsEqual(_pptActivePresentation, activePresentation)))
+ {
+ SafeReleaseComObject(activePresentation);
+ }
}
bool isSlideShowActive = false;
try
{
dynamic app = PPTApplication;
- activePresentation = app.ActivePresentation;
+ if (activePresentation == null)
+ {
+ try
+ {
+ activePresentation = app.ActivePresentation;
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"访问ActivePresentation失败: {ex.Message},继续使用轮询模式", LogHelper.LogType.Warning);
+ }
+ }
if (activePresentation != null)
{
@@ -356,9 +368,10 @@ namespace Ink_Canvas.Helpers
catch { }
}
- if (isSlideShowActive)
+ if (isSlideShowActive && activePresentation != null)
{
- slideShowWindow = activePresentation.SlideShowWindow;
+ dynamic pres = activePresentation;
+ slideShowWindow = pres.SlideShowWindow;
if (_pptSlideShowWindow == null || !PPTROTConnectionHelper.IsValidSlideShowWindow(_pptSlideShowWindow))
{
if (!PPTROTConnectionHelper.AreComObjectsEqual(_pptSlideShowWindow, slideShowWindow))
@@ -380,8 +393,11 @@ namespace Ink_Canvas.Helpers
}
finally
{
- SafeReleaseComObject(activePresentation);
- if (!PPTROTConnectionHelper.AreComObjectsEqual(_pptSlideShowWindow, slideShowWindow))
+ if (activePresentation != null && (_pptActivePresentation == null || !PPTROTConnectionHelper.AreComObjectsEqual(_pptActivePresentation, activePresentation)))
+ {
+ SafeReleaseComObject(activePresentation);
+ }
+ if (slideShowWindow != null && !PPTROTConnectionHelper.AreComObjectsEqual(_pptSlideShowWindow, slideShowWindow))
{
SafeReleaseComObject(slideShowWindow);
}
@@ -393,7 +409,8 @@ namespace Ink_Canvas.Helpers
{
try
{
- slideShowWindow = _pptActivePresentation.SlideShowWindow;
+ dynamic pres = _pptActivePresentation;
+ slideShowWindow = pres.SlideShowWindow;
int tempTotalPage = -1;
if (slideShowWindow != null)
@@ -828,95 +845,115 @@ namespace Ink_Canvas.Helpers
{
if (_pptActivePresentation != null)
{
- CurrentPresentation = _pptActivePresentation;
- CurrentSlides = CurrentPresentation.Slides;
-
try
{
- var slideCount = CurrentSlides.Count;
- if (slideCount > 0)
+ CurrentPresentation = _pptActivePresentation as Presentation;
+ if (CurrentPresentation != null)
{
- SlidesCount = slideCount;
+ CurrentSlides = CurrentPresentation.Slides;
}
else
{
- SlidesCount = 0;
- LogHelper.WriteLogToFile("PPT演示文稿页数为0,可能为空演示文稿", LogHelper.LogType.Warning);
+ dynamic pres = _pptActivePresentation;
+ CurrentSlides = pres.Slides as Slides;
}
}
- catch (COMException comEx)
+ catch
{
- var hr = (uint)comEx.HResult;
- SlidesCount = 0;
- LogHelper.WriteLogToFile($"读取PPT页数失败: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning);
+ dynamic pres = _pptActivePresentation;
+ CurrentSlides = pres.Slides as Slides;
}
- try
+ if (CurrentSlides != null)
{
- if (IsInSlideShow && _pptSlideShowWindow != null)
+ try
{
- try
+ var slideCount = CurrentSlides.Count;
+ if (slideCount > 0)
{
- view = _pptSlideShowWindow.View;
- if (view != null)
- {
- dynamic viewObj = view;
- CurrentSlide = viewObj.Slide as Slide;
- }
+ SlidesCount = slideCount;
}
- catch { }
- }
- else
- {
- dynamic app = PPTApplication;
- activeWindow = app.ActiveWindow;
- if (activeWindow != null)
+ else
{
- dynamic aw = activeWindow;
- selection = aw.Selection;
- if (selection != null)
+ SlidesCount = 0;
+ LogHelper.WriteLogToFile("PPT演示文稿页数为0,可能为空演示文稿", LogHelper.LogType.Warning);
+ }
+ }
+ catch (COMException comEx)
+ {
+ var hr = (uint)comEx.HResult;
+ SlidesCount = 0;
+ LogHelper.WriteLogToFile($"读取PPT页数失败: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning);
+ }
+
+ try
+ {
+ if (IsInSlideShow && _pptSlideShowWindow != null)
+ {
+ try
{
- dynamic sel = selection;
- slideRange = sel.SlideRange;
- if (slideRange != null)
+ dynamic ssw = _pptSlideShowWindow;
+ view = ssw.View;
+ if (view != null)
{
- dynamic sr = slideRange;
- int slideNumber = sr.SlideNumber;
- if (slideNumber > 0 && slideNumber <= SlidesCount)
+ dynamic viewObj = view;
+ CurrentSlide = viewObj.Slide as Slide;
+ }
+ }
+ catch { }
+ }
+ else
+ {
+ dynamic app = PPTApplication;
+ activeWindow = app.ActiveWindow;
+ if (activeWindow != null)
+ {
+ dynamic aw = activeWindow;
+ selection = aw.Selection;
+ if (selection != null)
+ {
+ dynamic sel = selection;
+ slideRange = sel.SlideRange;
+ if (slideRange != null)
{
- CurrentSlide = CurrentSlides[slideNumber];
+ dynamic sr = slideRange;
+ int slideNumber = sr.SlideNumber;
+ if (slideNumber > 0 && slideNumber <= SlidesCount)
+ {
+ CurrentSlide = CurrentSlides[slideNumber];
+ }
}
}
}
+
+ if (CurrentSlide == null && SlidesCount > 0)
+ {
+ CurrentSlide = CurrentSlides[1];
+ }
}
-
- if (CurrentSlide == null && SlidesCount > 0)
+ }
+ catch (COMException comEx)
+ {
+ var hr = (uint)comEx.HResult;
+ if (hr != 0x8001010E && hr != 0x80004005)
+ {
+ LogHelper.WriteLogToFile($"获取当前幻灯片失败: {comEx.Message}", LogHelper.LogType.Warning);
+ }
+
+ if (SlidesCount > 0)
{
CurrentSlide = CurrentSlides[1];
}
}
}
- catch (COMException comEx)
+ else
{
- var hr = (uint)comEx.HResult;
- if (hr != 0x8001010E && hr != 0x80004005)
- {
- LogHelper.WriteLogToFile($"获取当前幻灯片失败: {comEx.Message}", LogHelper.LogType.Warning);
- }
-
- if (SlidesCount > 0)
- {
- CurrentSlide = CurrentSlides[1];
- }
+ CurrentPresentation = null;
+ CurrentSlides = null;
+ CurrentSlide = null;
+ SlidesCount = 0;
}
}
- else
- {
- CurrentPresentation = null;
- CurrentSlides = null;
- CurrentSlide = null;
- SlidesCount = 0;
- }
}
catch (COMException comEx)
{
@@ -1412,7 +1449,7 @@ namespace Ink_Canvas.Helpers
///
/// 获取当前活跃的演示文稿
///
- public Presentation GetCurrentActivePresentation()
+ public object GetCurrentActivePresentation()
{
object slideShowWindows = null;
object slideShowWindow = null;
@@ -1447,7 +1484,7 @@ namespace Ink_Canvas.Helpers
{
dynamic slideObj = slide;
presentation = slideObj.Parent;
- return presentation as Presentation;
+ return presentation;
}
}
}
@@ -1463,7 +1500,7 @@ namespace Ink_Canvas.Helpers
presentation = aw.Presentation;
if (presentation != null)
{
- return presentation as Presentation;
+ return presentation;
}
}
@@ -1505,7 +1542,7 @@ namespace Ink_Canvas.Helpers
///
/// 获取当前幻灯片编号
///
- private int GetCurrentSlideIndex(SlideShowWindow slideShowWindow)
+ private int GetCurrentSlideIndex(dynamic slideShowWindow)
{
object view = null;
object slide = null;
@@ -1513,7 +1550,8 @@ namespace Ink_Canvas.Helpers
try
{
if (slideShowWindow == null) return 0;
- view = slideShowWindow.View;
+ dynamic ssw = slideShowWindow;
+ view = ssw.View;
if (view != null)
{
dynamic viewObj = view;
@@ -1533,12 +1571,13 @@ namespace Ink_Canvas.Helpers
}
}
- private int GetTotalSlideIndex(Presentation presentation)
+ private int GetTotalSlideIndex(dynamic presentation)
{
try
{
if (presentation == null) return 0;
- return presentation.Slides.Count;
+ dynamic pres = presentation;
+ return pres.Slides.Count;
}
catch
{
diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs
index 15b5d6bd..7ccee9f7 100644
--- a/Ink Canvas/MainWindow_cs/MW_PPT.cs
+++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs
@@ -644,7 +644,7 @@ namespace Ink_Canvas
}
else
{
- activePresentation = _pptManager?.GetCurrentActivePresentation();
+ activePresentation = _pptManager?.GetCurrentActivePresentation() as Presentation;
currentSlide = _pptManager?.GetCurrentSlideNumber() ?? 0;
totalSlides = _pptManager?.SlidesCount ?? 0;
// 初始化当前播放页码跟踪