improve:ROT联动
This commit is contained in:
@@ -71,12 +71,10 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
Type appType = typeof(Microsoft.Office.Interop.PowerPoint.Application);
|
Type appType = typeof(Microsoft.Office.Interop.PowerPoint.Application);
|
||||||
Microsoft.Office.Interop.PowerPoint.Application pptApp = null;
|
Microsoft.Office.Interop.PowerPoint.Application pptApp = null;
|
||||||
|
|
||||||
if (appType.IsInstanceOfType(bestApp))
|
if (appType.IsInstanceOfType(bestApp))
|
||||||
{
|
{
|
||||||
pptApp = (Microsoft.Office.Interop.PowerPoint.Application)bestApp;
|
pptApp = (Microsoft.Office.Interop.PowerPoint.Application)bestApp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pptApp != null)
|
if (pptApp != null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -87,9 +85,8 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"ROT 连接验证失败: {ex.Message}", LogHelper.LogType.Warning);
|
LogHelper.WriteLogToFile($"ROT 连接验证 Name 不可用(将依赖 SlideShowWindows): {ex.Message}", LogHelper.LogType.Warning);
|
||||||
SafeReleaseComObject(bestApp);
|
return pptApp;
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -108,6 +105,45 @@ namespace Ink_Canvas.Helpers
|
|||||||
SafeReleaseComObject(bestApp);
|
SafeReleaseComObject(bestApp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pptApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
|
||||||
|
if (pptApp != null && Marshal.IsComObject(pptApp))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var _ = pptApp.Name;
|
||||||
|
}
|
||||||
|
catch (COMException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return pptApp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (COMException) { }
|
||||||
|
catch (InvalidCastException) { }
|
||||||
|
|
||||||
|
if (isSupportWPS)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var wpsApp = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("kwpp.Application");
|
||||||
|
if (wpsApp != null && Marshal.IsComObject(wpsApp))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var _ = wpsApp.Name;
|
||||||
|
}
|
||||||
|
catch (COMException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return wpsApp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (COMException) { }
|
||||||
|
catch (InvalidCastException) { }
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -39,19 +39,22 @@ namespace Ink_Canvas.Helpers
|
|||||||
if (_pptApplication == null) return false;
|
if (_pptApplication == null) return false;
|
||||||
if (!Marshal.IsComObject(_pptApplication)) return false;
|
if (!Marshal.IsComObject(_pptApplication)) return false;
|
||||||
|
|
||||||
// 访问 Name 属性验证 COM 是否仍然有效
|
try
|
||||||
dynamic app = _pptApplication;
|
|
||||||
var _ = app.Name;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (COMException comEx)
|
|
||||||
{
|
|
||||||
var hr = (uint)comEx.HResult;
|
|
||||||
if (hr == 0x8001010E || hr == 0x80004005 || hr == 0x800706B5)
|
|
||||||
{
|
{
|
||||||
|
dynamic app = _pptApplication;
|
||||||
|
var _ = app.Name;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (COMException comEx)
|
||||||
|
{
|
||||||
|
var hr = (uint)comEx.HResult;
|
||||||
|
if (hr == 0x8001010E || hr == 0x80004005)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (hr == 0x800706B5) return false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
@@ -94,7 +97,6 @@ namespace Ink_Canvas.Helpers
|
|||||||
var hr = (uint)comEx.HResult;
|
var hr = (uint)comEx.HResult;
|
||||||
if (hr == 0x8001010E || hr == 0x80004005)
|
if (hr == 0x8001010E || hr == 0x80004005)
|
||||||
{
|
{
|
||||||
DisconnectFromPPT();
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -104,9 +106,11 @@ namespace Ink_Canvas.Helpers
|
|||||||
var hr = (uint)comEx.HResult;
|
var hr = (uint)comEx.HResult;
|
||||||
if (hr == 0x8001010E || hr == 0x80004005)
|
if (hr == 0x8001010E || hr == 0x80004005)
|
||||||
{
|
{
|
||||||
DisconnectFromPPT();
|
|
||||||
}
|
}
|
||||||
LogHelper.WriteLogToFile($"[ROT] 检查 PPT 放映状态失败: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning);
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"[ROT] 检查 PPT 放映状态失败: {comEx.Message} (HR: 0x{hr:X8})", LogHelper.LogType.Warning);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -343,8 +347,28 @@ namespace Ink_Canvas.Helpers
|
|||||||
var currentSlideShowState = IsInSlideShow;
|
var currentSlideShowState = IsInSlideShow;
|
||||||
if (currentSlideShowState != _lastSlideShowState)
|
if (currentSlideShowState != _lastSlideShowState)
|
||||||
{
|
{
|
||||||
|
var wasInSlideShow = _lastSlideShowState;
|
||||||
_lastSlideShowState = currentSlideShowState;
|
_lastSlideShowState = currentSlideShowState;
|
||||||
SlideShowStateChanged?.Invoke(currentSlideShowState);
|
SlideShowStateChanged?.Invoke(currentSlideShowState);
|
||||||
|
|
||||||
|
if (currentSlideShowState && !wasInSlideShow)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var app = _pptApplication as Microsoft.Office.Interop.PowerPoint.Application;
|
||||||
|
if (app != null && app.SlideShowWindows.Count >= 1)
|
||||||
|
{
|
||||||
|
var wn = app.SlideShowWindows[1];
|
||||||
|
if (wn != null)
|
||||||
|
{
|
||||||
|
OnSlideShowBeginInternal(wn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (COMException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -366,7 +390,7 @@ namespace Ink_Canvas.Helpers
|
|||||||
{
|
{
|
||||||
_pptApplication = appObj;
|
_pptApplication = appObj;
|
||||||
|
|
||||||
// 在 UI 线程上注册事件(使用 Interop 类型做内部绑定,不向外泄露)
|
// 在 UI 线程上注册事件(无打开文档时可能失败,不因此断开连接)
|
||||||
Application.Current?.Dispatcher?.Invoke(() =>
|
Application.Current?.Dispatcher?.Invoke(() =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -379,11 +403,11 @@ namespace Ink_Canvas.Helpers
|
|||||||
app.SlideShowBegin += OnSlideShowBeginInternal;
|
app.SlideShowBegin += OnSlideShowBeginInternal;
|
||||||
app.SlideShowNextSlide += OnSlideShowNextSlideInternal;
|
app.SlideShowNextSlide += OnSlideShowNextSlideInternal;
|
||||||
app.SlideShowEnd += OnSlideShowEndInternal;
|
app.SlideShowEnd += OnSlideShowEndInternal;
|
||||||
|
LogHelper.WriteLogToFile("[ROT] PPT 事件注册成功", LogHelper.LogType.Trace);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile($"[ROT] PPT 事件注册失败: {ex}", LogHelper.LogType.Error);
|
LogHelper.WriteLogToFile($"[ROT] PPT 事件注册失败(将依赖轮询检测放映状态): {ex}", LogHelper.LogType.Warning);
|
||||||
throw;
|
|
||||||
}
|
}
|
||||||
}, DispatcherPriority.Normal);
|
}, DispatcherPriority.Normal);
|
||||||
|
|
||||||
@@ -401,7 +425,7 @@ namespace Ink_Canvas.Helpers
|
|||||||
OnSlideShowBeginInternal(app.SlideShowWindows[1]);
|
OnSlideShowBeginInternal(app.SlideShowWindows[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch (COMException)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1103,11 +1127,10 @@ namespace Ink_Canvas.Helpers
|
|||||||
catch (COMException comEx)
|
catch (COMException comEx)
|
||||||
{
|
{
|
||||||
var hr = (uint)comEx.HResult;
|
var hr = (uint)comEx.HResult;
|
||||||
if (hr == 0x8001010E || hr == 0x80004005)
|
if (hr != 0x8001010E && hr != 0x80004005)
|
||||||
{
|
{
|
||||||
DisconnectFromPPT();
|
LogHelper.WriteLogToFile($"[ROT] 获取当前演示文稿失败: {comEx.Message}", LogHelper.LogType.Error);
|
||||||
}
|
}
|
||||||
LogHelper.WriteLogToFile($"[ROT] 获取当前演示文稿失败: {comEx.Message}", LogHelper.LogType.Error);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
Reference in New Issue
Block a user