improve:PPT联动
This commit is contained in:
@@ -291,13 +291,18 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
catch (COMException)
|
catch (COMException ex)
|
||||||
{
|
{
|
||||||
|
var hr = (uint)ex.HResult;
|
||||||
|
if (hr == 0x800401E3 || hr == 0x800401F3 || hr == 0x800401E4)
|
||||||
|
{
|
||||||
|
return TryConnectToPowerPointViaROT();
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
catch (InvalidCastException)
|
catch (InvalidCastException)
|
||||||
{
|
{
|
||||||
return null;
|
return TryConnectToPowerPointViaROT();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
@@ -305,6 +310,20 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Microsoft.Office.Interop.PowerPoint.Application TryConnectToPowerPointViaROT()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pptApp = PPTROTConnectionHelper.TryConnectViaROT(IsSupportWPS);
|
||||||
|
return pptApp;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"ROT 备用方法连接异常: {ex}", LogHelper.LogType.Error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Microsoft.Office.Interop.PowerPoint.Application TryConnectToWPS()
|
private Microsoft.Office.Interop.PowerPoint.Application TryConnectToWPS()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -318,13 +337,24 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
catch (COMException)
|
catch (COMException ex)
|
||||||
{
|
{
|
||||||
|
var hr = (uint)ex.HResult;
|
||||||
|
if (hr == 0x800401E3 || hr == 0x800401F3 || hr == 0x800401E4)
|
||||||
|
{
|
||||||
|
// WPS COM注册损坏,尝试使用ROT备用方法
|
||||||
|
return TryConnectToWPSViaROT();
|
||||||
|
}
|
||||||
|
if (hr != 0x80004005 && hr != 0x800706B5 && hr != 0x8001010E)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"连接WPS失败: {ex}", LogHelper.LogType.Warning);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
catch (InvalidCastException)
|
catch (InvalidCastException)
|
||||||
{
|
{
|
||||||
return null;
|
// WPS COM对象类型转换失败,尝试使用ROT备用方法
|
||||||
|
return TryConnectToWPSViaROT();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
@@ -332,6 +362,20 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Microsoft.Office.Interop.PowerPoint.Application TryConnectToWPSViaROT()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var wpsApp = PPTROTConnectionHelper.TryConnectViaROT(true);
|
||||||
|
return wpsApp;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"ROT 备用方法连接 WPS 异常: {ex}", LogHelper.LogType.Error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ConnectToPPT(Microsoft.Office.Interop.PowerPoint.Application pptApp)
|
private void ConnectToPPT(Microsoft.Office.Interop.PowerPoint.Application pptApp)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -1058,35 +1102,55 @@ namespace Ink_Canvas.Helpers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public Presentation GetCurrentActivePresentation()
|
public Presentation GetCurrentActivePresentation()
|
||||||
{
|
{
|
||||||
|
object slideShowWindows = null;
|
||||||
|
object slideShowWindow = null;
|
||||||
|
object view = null;
|
||||||
|
object slide = null;
|
||||||
|
object activeWindow = null;
|
||||||
|
object presentation = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!IsConnected || PPTApplication == null) return null;
|
if (!IsConnected || PPTApplication == null) return null;
|
||||||
if (!Marshal.IsComObject(PPTApplication)) return null;
|
if (!Marshal.IsComObject(PPTApplication)) return null;
|
||||||
|
|
||||||
if (IsInSlideShow && PPTApplication.SlideShowWindows.Count > 0)
|
if (IsInSlideShow)
|
||||||
{
|
{
|
||||||
try
|
slideShowWindows = PPTApplication.SlideShowWindows;
|
||||||
|
if (slideShowWindows != null)
|
||||||
{
|
{
|
||||||
var slideShowWindow = PPTApplication.SlideShowWindows[1];
|
dynamic ssw = slideShowWindows;
|
||||||
if (slideShowWindow?.View != null)
|
if (ssw.Count > 0)
|
||||||
{
|
{
|
||||||
return (Presentation)slideShowWindow.View.Slide.Parent;
|
slideShowWindow = ssw[1];
|
||||||
|
if (slideShowWindow != null)
|
||||||
|
{
|
||||||
|
dynamic sswObj = slideShowWindow;
|
||||||
|
view = sswObj.View;
|
||||||
|
if (view != null)
|
||||||
|
{
|
||||||
|
dynamic viewObj = view;
|
||||||
|
slide = viewObj.Slide;
|
||||||
|
if (slide != null)
|
||||||
|
{
|
||||||
|
dynamic slideObj = slide;
|
||||||
|
presentation = slideObj.Parent;
|
||||||
|
return presentation as Presentation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (COMException comEx)
|
|
||||||
{
|
|
||||||
var hr = (uint)comEx.HResult;
|
|
||||||
if (hr == 0x80048240)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PPTApplication.ActiveWindow?.Presentation != null)
|
activeWindow = PPTApplication.ActiveWindow;
|
||||||
|
if (activeWindow != null)
|
||||||
{
|
{
|
||||||
return PPTApplication.ActiveWindow.Presentation;
|
dynamic aw = activeWindow;
|
||||||
|
presentation = aw.Presentation;
|
||||||
|
if (presentation != null)
|
||||||
|
{
|
||||||
|
return presentation as Presentation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CurrentPresentation;
|
return CurrentPresentation;
|
||||||
@@ -1098,6 +1162,10 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
DisconnectFromPPT();
|
DisconnectFromPPT();
|
||||||
}
|
}
|
||||||
|
if (hr == 0x80048240)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
LogHelper.WriteLogToFile($"获取当前活跃演示文稿失败: {comEx.Message}", LogHelper.LogType.Warning);
|
LogHelper.WriteLogToFile($"获取当前活跃演示文稿失败: {comEx.Message}", LogHelper.LogType.Warning);
|
||||||
return CurrentPresentation;
|
return CurrentPresentation;
|
||||||
}
|
}
|
||||||
@@ -1106,6 +1174,18 @@ namespace Ink_Canvas.Helpers
|
|||||||
LogHelper.WriteLogToFile($"获取当前活跃演示文稿失败: {ex}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"获取当前活跃演示文稿失败: {ex}", LogHelper.LogType.Error);
|
||||||
return CurrentPresentation;
|
return CurrentPresentation;
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (presentation != null && !ReferenceEquals(presentation, CurrentPresentation))
|
||||||
|
{
|
||||||
|
SafeReleaseComObject(presentation);
|
||||||
|
}
|
||||||
|
SafeReleaseComObject(slide);
|
||||||
|
SafeReleaseComObject(view);
|
||||||
|
SafeReleaseComObject(slideShowWindow);
|
||||||
|
SafeReleaseComObject(slideShowWindows);
|
||||||
|
SafeReleaseComObject(activeWindow);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user