improve:墨迹保存

This commit is contained in:
CJK_mkp
2025-06-08 23:47:27 +08:00
parent c2f2f3a9af
commit a3b61d984d
2 changed files with 127 additions and 109 deletions
+122 -108
View File
@@ -1,4 +1,4 @@
using Ink_Canvas.Helpers; using Ink_Canvas.Helpers;
using iNKORE.UI.WPF.Modern; using iNKORE.UI.WPF.Modern;
using Microsoft.Office.Core; using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint; using Microsoft.Office.Interop.PowerPoint;
@@ -29,28 +29,11 @@ namespace Ink_Canvas {
private void BtnCheckPPT_Click(object sender, RoutedEventArgs e) { private void BtnCheckPPT_Click(object sender, RoutedEventArgs e) {
try { try {
// 优先尝试获取 WPS 实例 pptApplication =
if (Settings.PowerPointSettings.IsSupportWPS) { (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("kwpp.Application");
try {
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("wpp.Application");
}
catch (COMException) {
pptApplication = null;
}
}
// 如果 WPS 实例未获取到,尝试获取 PowerPoint 实例
if (pptApplication == null) {
try {
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
}
catch (COMException) {
pptApplication = null;
}
}
if (pptApplication != null) { if (pptApplication != null) {
// 获得演示文稿对象 //获得演示文稿对象
presentation = pptApplication.ActivePresentation; presentation = pptApplication.ActivePresentation;
pptApplication.SlideShowBegin += PptApplication_SlideShowBegin; pptApplication.SlideShowBegin += PptApplication_SlideShowBegin;
pptApplication.SlideShowNextSlide += PptApplication_SlideShowNextSlide; pptApplication.SlideShowNextSlide += PptApplication_SlideShowNextSlide;
@@ -98,95 +81,138 @@ namespace Ink_Canvas {
public static bool IsShowingRestoreHiddenSlidesWindow = false; public static bool IsShowingRestoreHiddenSlidesWindow = false;
private static bool IsShowingAutoplaySlidesWindow = false; private static bool IsShowingAutoplaySlidesWindow = false;
private bool isPowerPointInitialized = false; private bool isPowerPointInitialized = false;
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e) {
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e)
{
// 如果正在显示特定窗口,则跳过检查 // 如果正在显示特定窗口,则跳过检查
if (IsShowingRestoreHiddenSlidesWindow || IsShowingAutoplaySlidesWindow) if (IsShowingRestoreHiddenSlidesWindow || IsShowingAutoplaySlidesWindow)
return; return;
try { try
{
// 检查是否已有初始化的 PowerPoint 实例 // 检查是否已有初始化的 PowerPoint 实例
if (!isPowerPointInitialized) { if (!isPowerPointInitialized)
// 优先尝试获取 WPS 实例 {
if (isWPSSupportOn) { // 检查 WPS 进程(如果不支持则返回)
try { var wpsProcesses = Process.GetProcessesByName("wpp");
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("wpp.Application"); if (wpsProcesses.Length > 0 && !isWPSSupportOn)
return;
try
{
if (isWPSSupportOn && wpsProcesses.Length > 0)
{
// 优先获取WPS实例
try
{
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("wpp.Application");
}
catch (COMException)
{
// WPS未启动或未注册
pptApplication = null;
}
} }
catch (COMException) { if (pptApplication == null)
pptApplication = null; {
// 获取PowerPoint实例
try
{
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
}
catch (COMException)
{
pptApplication = null;
}
} }
} }
catch (Exception)
// 如果 WPS 实例未获取到,尝试获取 PowerPoint 实例 {
if (pptApplication == null) { pptApplication = null;
try {
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
}
catch (COMException) {
pptApplication = null;
}
} }
// 如果没有找到运行中的实例,则创建新实例 // 如果没有找到运行中的实例,则创建新实例
if (pptApplication == null) { if (pptApplication == null)
try { {
if (isWPSSupportOn) { try
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance( {
Type.GetTypeFromProgID("wpp.Application")); pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
} Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
else {
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
}
} }
catch (Exception) { catch
pptApplication = null; {
// 如果WPS支持开启,尝试创建WPS实例
if (isWPSSupportOn)
{
try
{
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
Type.GetTypeFromProgID("wpp.Application"));
}
catch
{
pptApplication = null;
}
}
} }
} }
isPowerPointInitialized = true; isPowerPointInitialized = true;
return; return;
} }
// 检查 PowerPoint 进程是否还在 // 检查 PowerPoint 进程是否还在
var pptProcesses = Process.GetProcessesByName("POWERPNT"); var pptProcesses = Process.GetProcessesByName("POWERPNT");
var wpsProcessesCheck = Process.GetProcessesByName("wpp"); var wpsProcessesCheck = Process.GetProcessesByName("wpp");
bool isWpsMode = isWPSSupportOn && wpsProcessesCheck.Length > 0; bool isWpsMode = isWPSSupportOn && wpsProcessesCheck.Length > 0;
if ((isWpsMode && wpsProcessesCheck.Length == 0) || (!isWpsMode && pptProcesses.Length == 0)) { if ((isWpsMode && wpsProcessesCheck.Length == 0) || (!isWpsMode && pptProcesses.Length == 0))
{
// 进程已关闭,清理对象 // 进程已关闭,清理对象
if (pptApplication != null) { if (pptApplication != null)
{
try { Marshal.ReleaseComObject(pptApplication); } catch { } try { Marshal.ReleaseComObject(pptApplication); } catch { }
pptApplication = null; pptApplication = null;
} }
if (presentation != null) { if (presentation != null)
{
try { Marshal.ReleaseComObject(presentation); } catch { } try { Marshal.ReleaseComObject(presentation); } catch { }
presentation = null; presentation = null;
} }
if (slides != null) { if (slides != null)
{
try { Marshal.ReleaseComObject(slides); } catch { } try { Marshal.ReleaseComObject(slides); } catch { }
slides = null; slides = null;
} }
slide = null; slide = null;
isPowerPointInitialized = false; isPowerPointInitialized = false;
// 这里可以选择自动重启 PowerPoint 或 WPS 或等待用户操作 // 这里可以选择自动重启 PowerPoint 或 WPS 或等待用户操作
try { try
if (isWpsMode) { {
// 自动重启 WPS if (isWpsMode)
{
// 自动重启WPS
Process.Start("wpp.exe"); Process.Start("wpp.exe");
Thread.Sleep(2000); // 等待 WPS 启动 Thread.Sleep(2000); // 等待WPS启动
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance( pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
Type.GetTypeFromProgID("wpp.Application")); Type.GetTypeFromProgID("wpp.Application"));
} }
else { else
{
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance( pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B"))); Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
} }
isPowerPointInitialized = true; isPowerPointInitialized = true;
} }
catch (Exception ex) { catch (Exception ex)
{
LogHelper.WriteLogToFile("PowerPoint/WPS 守护重启失败: " + ex.ToString(), LogHelper.LogType.Error); LogHelper.WriteLogToFile("PowerPoint/WPS 守护重启失败: " + ex.ToString(), LogHelper.LogType.Error);
} }
return; return;
} }
if (pptApplication != null) { if (pptApplication != null) {
// 检查是否有活动演示文稿 // 检查是否有活动演示文稿
@@ -194,7 +220,7 @@ namespace Ink_Canvas {
return; // 退出方法,避免后续代码执行 return; // 退出方法,避免后续代码执行
isPowerPointInitialized = false; isPowerPointInitialized = false;
timerCheckPPT.Stop(); timerCheckPPT.Stop();
// 获得演示文稿对象 //获得演示文稿对象
presentation = pptApplication.ActivePresentation; presentation = pptApplication.ActivePresentation;
// 获得幻灯片对象集合 // 获得幻灯片对象集合
@@ -232,26 +258,25 @@ namespace Ink_Canvas {
BtnPPTSlideShow.Visibility = Visibility.Collapsed; BtnPPTSlideShow.Visibility = Visibility.Collapsed;
BtnPPTSlideShowEnd.Visibility = Visibility.Visible; BtnPPTSlideShowEnd.Visibility = Visibility.Visible;
UpdatePPTBtnDisplaySettingsStatus(); UpdatePPTBtnDisplaySettingsStatus();
} } else {
else {
BtnPPTSlideShow.Visibility = Visibility.Visible; BtnPPTSlideShow.Visibility = Visibility.Visible;
BtnPPTSlideShowEnd.Visibility = Visibility.Collapsed; BtnPPTSlideShowEnd.Visibility = Visibility.Collapsed;
} }
} } catch (Exception ex) {
catch (Exception ex) {
LogHelper.WriteLogToFile("Failed to update button visibility: " + ex.ToString(), LogHelper.LogType.Error); LogHelper.WriteLogToFile("Failed to update button visibility: " + ex.ToString(), LogHelper.LogType.Error);
} }
}); });
} }
if (pptApplication == null) return; if (pptApplication == null) return;
// 此处是已经开启了 // 此处是已经开启了
Application.Current.Dispatcher.Invoke(() => { Application.Current.Dispatcher.Invoke(() => {
PptApplication_PresentationOpen(null); PptApplication_PresentationOpen(null);
}); });
// 如果检测到已经开始放映,则立即进入画板模式 //如果检测到已经开始放映,则立即进入画板模式
if (pptApplication.SlideShowWindows.Count >= 1) { if (pptApplication.SlideShowWindows.Count >= 1) {
Application.Current.Dispatcher.Invoke(() => { Application.Current.Dispatcher.Invoke(() => {
PptApplication_SlideShowBegin(pptApplication.SlideShowWindows[1]); PptApplication_SlideShowBegin(pptApplication.SlideShowWindows[1]);
@@ -1023,47 +1048,36 @@ namespace Ink_Canvas {
} }
} }
private void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e) private async void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e) {
{ try {
try Application.Current.Dispatcher.Invoke(() => {
{ try {
// 检查 PowerPoint 进程是否还在运行 var ms = new MemoryStream();
var pptProcesses = Process.GetProcessesByName("POWERPNT"); inkCanvas.Strokes.Save(ms);
var wpsProcessesCheck = Process.GetProcessesByName("wpp"); ms.Position = 0;
bool isWpsMode = Settings.PowerPointSettings.IsSupportWPS && wpsProcessesCheck.Length > 0; memoryStreams[pptApplication.SlideShowWindows[1].View.CurrentShowPosition] = ms;
if ((isWpsMode && wpsProcessesCheck.Length == 0) || (!isWpsMode && pptProcesses.Length == 0)) timeMachine.ClearStrokeHistory();
{
LogHelper.WriteLogToFile("PowerPoint/WPS 进程已关闭,无法结束幻灯片放映", LogHelper.LogType.Error);
return;
}
if (pptApplication != null && pptApplication.SlideShowWindows.Count >= 1)
{
var slideShowWindow = pptApplication.SlideShowWindows[1];
var slideShowView = slideShowWindow.View;
// 检查 SlideShowView 对象是否有效
if (slideShowView != null)
{
try
{
// 尝试结束幻灯片放映
slideShowView.Exit();
}
catch (COMException ex)
{
LogHelper.WriteLogToFile($"结束幻灯片放映时发生 COM 异常: {ex.ToString()}", LogHelper.LogType.Error);
}
} }
else catch (Exception ex) {
{ LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
LogHelper.WriteLogToFile("SlideShowView 对象无效,无法结束幻灯片放映", LogHelper.LogType.Error);
} }
} });
new Thread(new ThreadStart(() => {
try {
pptApplication.SlideShowWindows[1].View.Exit();
}
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
}
})).Start();
HideSubPanels("cursor");
await Task.Delay(150);
ViewboxFloatingBarMarginAnimation(100, true);
} }
catch (Exception ex) catch (Exception ex) {
{ LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
LogHelper.WriteLogToFile($"结束幻灯片放映时发生异常: {ex.ToString()}", LogHelper.LogType.Error);
} }
} }
+5 -1
View File
@@ -100,7 +100,11 @@ namespace Ink_Canvas {
Directory.CreateDirectory(fullPath); Directory.CreateDirectory(fullPath);
} }
} }
catch (Exception) { catch (Exception ex) when
(ex is IOException ||
ex is UnauthorizedAccessException ||
ex is DirectoryNotFoundException) // 明确捕获与目录创建相关的异常
{
// 如果创建失败则使用文档目录 // 如果创建失败则使用文档目录
basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
fullPath = Path.Combine(basePath, "Auto Saved - Screenshots", dateFolder); fullPath = Path.Combine(basePath, "Auto Saved - Screenshots", dateFolder);