improve:ROT联动

This commit is contained in:
2026-02-22 22:04:58 +08:00
parent 7b7ce4320b
commit 99f0e25acf
2 changed files with 84 additions and 25 deletions
+41 -5
View File
@@ -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)
+43 -20
View File
@@ -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)