improve:PPT联动

This commit is contained in:
2026-01-18 00:28:47 +08:00
parent 6c616f2b6b
commit ed03d40ff3
+32 -28
View File
@@ -70,9 +70,9 @@ namespace Ink_Canvas
#region PPT Application Variables
public static Microsoft.Office.Interop.PowerPoint.Application pptApplication;
public static Presentation presentation;
public static Slides slides;
public static Slide slide;
public static dynamic presentation;
public static dynamic slides;
public static dynamic slide;
public static int slidescount;
#endregion
@@ -523,6 +523,7 @@ namespace Ink_Canvas
{
try
{
dynamic presObj = pres;
Application.Current.Dispatcher.InvokeAsync(() =>
{
// 在初始化墨迹管理器之前,先清理画布上的所有墨迹
@@ -534,26 +535,26 @@ namespace Ink_Canvas
TimeMachineHistories[0] = null;
}
_singlePPTInkManager?.InitializePresentation(pres);
_singlePPTInkManager?.InitializePresentation(presObj as Presentation);
// 处理跳转到首页或上次播放页的逻辑
HandlePresentationOpenNavigation(pres);
HandlePresentationOpenNavigation(presObj);
// 检查隐藏幻灯片
if (Settings.PowerPointSettings.IsNotifyHiddenPage)
{
CheckAndNotifyHiddenSlides(pres);
CheckAndNotifyHiddenSlides(presObj);
}
// 检查自动播放设置
if (Settings.PowerPointSettings.IsNotifyAutoPlayPresentation)
{
CheckAndNotifyAutoPlaySettings(pres);
CheckAndNotifyAutoPlaySettings(presObj);
}
_pptUIManager?.UpdateConnectionStatus(true);
LogHelper.WriteLogToFile($"已打开新演示文稿: {pres.Name},墨迹状态已清理", LogHelper.LogType.Event);
LogHelper.WriteLogToFile($"已打开新演示文稿: {presObj.Name},墨迹状态已清理", LogHelper.LogType.Event);
});
}
catch (Exception ex)
@@ -613,6 +614,7 @@ namespace Ink_Canvas
{
try
{
dynamic wnObj = wn;
if (Settings.Automation.IsAutoFoldInPPTSlideShow)
{
if (!isFloatingBarFolded)
@@ -630,21 +632,21 @@ namespace Ink_Canvas
await Application.Current.Dispatcher.InvokeAsync(async () =>
{
Presentation activePresentation = null;
dynamic activePresentation = null;
int currentSlide = 0;
int totalSlides = 0;
if (wn?.View != null && wn.Presentation != null)
if (wnObj?.View != null && wnObj.Presentation != null)
{
activePresentation = wn.Presentation;
currentSlide = wn.View.CurrentShowPosition;
activePresentation = wnObj.Presentation;
currentSlide = wnObj.View.CurrentShowPosition;
totalSlides = activePresentation.Slides.Count;
// 初始化当前播放页码跟踪
_currentSlideShowPosition = currentSlide;
}
else
{
activePresentation = _pptManager?.GetCurrentActivePresentation() as Presentation;
activePresentation = _pptManager?.GetCurrentActivePresentation();
currentSlide = _pptManager?.GetCurrentSlideNumber() ?? 0;
totalSlides = _pptManager?.SlidesCount ?? 0;
// 初始化当前播放页码跟踪
@@ -657,7 +659,7 @@ namespace Ink_Canvas
{
try
{
_singlePPTInkManager.InitializePresentation(activePresentation);
_singlePPTInkManager.InitializePresentation(activePresentation as Presentation);
}
catch (Exception)
{
@@ -787,15 +789,16 @@ namespace Ink_Canvas
{
try
{
dynamic wnObj = wn;
Application.Current.Dispatcher.InvokeAsync(() =>
{
if (wn?.View == null || wn.Presentation == null)
if (wnObj?.View == null || wnObj.Presentation == null)
{
return;
}
var currentSlide = wn.View.CurrentShowPosition;
var activePresentation = wn.Presentation;
var currentSlide = wnObj.View.CurrentShowPosition;
dynamic activePresentation = wnObj.Presentation;
var totalSlides = activePresentation.Slides.Count;
// 更新当前播放页码
@@ -816,6 +819,7 @@ namespace Ink_Canvas
{
try
{
dynamic presObj = pres;
if (Settings.Automation.IsAutoFoldAfterPPTSlideShow && !isFloatingBarFolded)
{
FoldFloatingBar_MouseUp(new object(), null);
@@ -837,9 +841,9 @@ namespace Ink_Canvas
// 如果无法获取,尝试从演示文稿的SlideShowWindow获取
try
{
if (pres.SlideShowWindow != null && pres.SlideShowWindow.View != null)
if (presObj.SlideShowWindow != null && presObj.SlideShowWindow.View != null)
{
currentPage = pres.SlideShowWindow.View.CurrentShowPosition;
currentPage = presObj.SlideShowWindow.View.CurrentShowPosition;
}
}
catch { }
@@ -847,7 +851,7 @@ namespace Ink_Canvas
}
// 保存墨迹和位置信息
_singlePPTInkManager?.SaveAllStrokesToFile(pres, currentPage);
_singlePPTInkManager?.SaveAllStrokesToFile(presObj as Presentation, currentPage);
await Application.Current.Dispatcher.InvokeAsync(() =>
{
@@ -947,7 +951,7 @@ namespace Ink_Canvas
#endregion
#region Helper Methods
private void HandlePresentationOpenNavigation(Presentation pres)
private void HandlePresentationOpenNavigation(dynamic pres)
{
try
{
@@ -966,7 +970,7 @@ namespace Ink_Canvas
}
}
private void ShowPreviousPageNotification(Presentation pres)
private void ShowPreviousPageNotification(dynamic pres)
{
try
{
@@ -980,7 +984,7 @@ namespace Ink_Canvas
if (!File.Exists(positionFile)) return;
if (int.TryParse(File.ReadAllText(positionFile), out var page) && page > 0)
if (int.TryParse(File.ReadAllText(positionFile), out int page) && page > 0)
{
_lastPlaybackPage = page;
new YesOrNoNotificationWindow($"上次播放到了第 {page} 页, 是否立即跳转", () =>
@@ -1013,14 +1017,14 @@ namespace Ink_Canvas
}
}
private void CheckAndNotifyHiddenSlides(Presentation pres)
private void CheckAndNotifyHiddenSlides(dynamic pres)
{
try
{
bool hasHiddenSlides = false;
if (pres?.Slides != null)
{
foreach (Slide slide in pres.Slides)
foreach (dynamic slide in pres.Slides)
{
if (slide.SlideShowTransition.Hidden == MsoTriState.msoTrue)
{
@@ -1040,7 +1044,7 @@ namespace Ink_Canvas
{
if (pres?.Slides != null)
{
foreach (Slide slide in pres.Slides)
foreach (dynamic slide in pres.Slides)
{
if (slide.SlideShowTransition.Hidden == MsoTriState.msoTrue)
slide.SlideShowTransition.Hidden = MsoTriState.msoFalse;
@@ -1066,7 +1070,7 @@ namespace Ink_Canvas
}
}
private void CheckAndNotifyAutoPlaySettings(Presentation pres)
private void CheckAndNotifyAutoPlaySettings(dynamic pres)
{
try
{
@@ -1075,7 +1079,7 @@ namespace Ink_Canvas
bool hasSlideTimings = false;
if (pres?.Slides != null)
{
foreach (Slide slide in pres.Slides)
foreach (dynamic slide in pres.Slides)
{
if (slide.SlideShowTransition.AdvanceOnTime == MsoTriState.msoTrue &&
slide.SlideShowTransition.AdvanceTime > 0)