fix:issue #18
This commit is contained in:
+109
-123
@@ -1,4 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using Ink_Canvas.Helpers;
|
||||
using iNKORE.UI.WPF.Modern;
|
||||
using Microsoft.Office.Core;
|
||||
using Microsoft.Office.Interop.PowerPoint;
|
||||
@@ -29,11 +29,28 @@ namespace Ink_Canvas {
|
||||
|
||||
private void BtnCheckPPT_Click(object sender, RoutedEventArgs e) {
|
||||
try {
|
||||
pptApplication =
|
||||
(Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("kwpp.Application");
|
||||
|
||||
// 优先尝试获取 WPS 实例
|
||||
if (Settings.PowerPointSettings.IsSupportWPS) {
|
||||
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) {
|
||||
//获得演示文稿对象
|
||||
// 获得演示文稿对象
|
||||
presentation = pptApplication.ActivePresentation;
|
||||
pptApplication.SlideShowBegin += PptApplication_SlideShowBegin;
|
||||
pptApplication.SlideShowNextSlide += PptApplication_SlideShowNextSlide;
|
||||
@@ -81,138 +98,95 @@ namespace Ink_Canvas {
|
||||
public static bool IsShowingRestoreHiddenSlidesWindow = false;
|
||||
private static bool IsShowingAutoplaySlidesWindow = false;
|
||||
private bool isPowerPointInitialized = false;
|
||||
|
||||
|
||||
|
||||
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e) {
|
||||
// 如果正在显示特定窗口,则跳过检查
|
||||
if (IsShowingRestoreHiddenSlidesWindow || IsShowingAutoplaySlidesWindow)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
try {
|
||||
// 检查是否已有初始化的 PowerPoint 实例
|
||||
if (!isPowerPointInitialized)
|
||||
{
|
||||
// 检查 WPS 进程(如果不支持则返回)
|
||||
var wpsProcesses = Process.GetProcessesByName("wpp");
|
||||
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;
|
||||
}
|
||||
if (!isPowerPointInitialized) {
|
||||
// 优先尝试获取 WPS 实例
|
||||
if (isWPSSupportOn) {
|
||||
try {
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("wpp.Application");
|
||||
}
|
||||
if (pptApplication == null)
|
||||
{
|
||||
// 获取PowerPoint实例
|
||||
try
|
||||
{
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
|
||||
}
|
||||
catch (COMException)
|
||||
{
|
||||
pptApplication = null;
|
||||
}
|
||||
catch (COMException) {
|
||||
pptApplication = null;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
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)
|
||||
{
|
||||
try
|
||||
{
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
|
||||
Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 如果WPS支持开启,尝试创建WPS实例
|
||||
if (isWPSSupportOn)
|
||||
{
|
||||
try
|
||||
{
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
|
||||
Type.GetTypeFromProgID("wpp.Application"));
|
||||
}
|
||||
catch
|
||||
{
|
||||
pptApplication = null;
|
||||
}
|
||||
if (pptApplication == null) {
|
||||
try {
|
||||
if (isWPSSupportOn) {
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
|
||||
Type.GetTypeFromProgID("wpp.Application"));
|
||||
}
|
||||
else {
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
|
||||
Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
|
||||
}
|
||||
}
|
||||
catch (Exception) {
|
||||
pptApplication = null;
|
||||
}
|
||||
}
|
||||
isPowerPointInitialized = true;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 检查 PowerPoint 进程是否还在
|
||||
var pptProcesses = Process.GetProcessesByName("POWERPNT");
|
||||
var wpsProcessesCheck = Process.GetProcessesByName("wpp");
|
||||
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 { }
|
||||
pptApplication = null;
|
||||
}
|
||||
if (presentation != null)
|
||||
{
|
||||
if (presentation != null) {
|
||||
try { Marshal.ReleaseComObject(presentation); } catch { }
|
||||
presentation = null;
|
||||
}
|
||||
if (slides != null)
|
||||
{
|
||||
if (slides != null) {
|
||||
try { Marshal.ReleaseComObject(slides); } catch { }
|
||||
slides = null;
|
||||
}
|
||||
slide = null;
|
||||
isPowerPointInitialized = false;
|
||||
// 这里可以选择自动重启 PowerPoint 或 WPS 或等待用户操作
|
||||
try
|
||||
{
|
||||
if (isWpsMode)
|
||||
{
|
||||
// 自动重启WPS
|
||||
try {
|
||||
if (isWpsMode) {
|
||||
// 自动重启 WPS
|
||||
Process.Start("wpp.exe");
|
||||
Thread.Sleep(2000); // 等待WPS启动
|
||||
Thread.Sleep(2000); // 等待 WPS 启动
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
|
||||
Type.GetTypeFromProgID("wpp.Application"));
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(
|
||||
Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
|
||||
}
|
||||
isPowerPointInitialized = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
catch (Exception ex) {
|
||||
LogHelper.WriteLogToFile("PowerPoint/WPS 守护重启失败: " + ex.ToString(), LogHelper.LogType.Error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (pptApplication != null) {
|
||||
// 检查是否有活动演示文稿
|
||||
@@ -220,7 +194,7 @@ namespace Ink_Canvas {
|
||||
return; // 退出方法,避免后续代码执行
|
||||
isPowerPointInitialized = false;
|
||||
timerCheckPPT.Stop();
|
||||
//获得演示文稿对象
|
||||
// 获得演示文稿对象
|
||||
presentation = pptApplication.ActivePresentation;
|
||||
|
||||
// 获得幻灯片对象集合
|
||||
@@ -258,25 +232,26 @@ namespace Ink_Canvas {
|
||||
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
|
||||
BtnPPTSlideShowEnd.Visibility = Visibility.Visible;
|
||||
UpdatePPTBtnDisplaySettingsStatus();
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
BtnPPTSlideShow.Visibility = Visibility.Visible;
|
||||
BtnPPTSlideShowEnd.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
catch (Exception ex) {
|
||||
LogHelper.WriteLogToFile("Failed to update button visibility: " + ex.ToString(), LogHelper.LogType.Error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (pptApplication == null) return;
|
||||
|
||||
|
||||
// 此处是已经开启了
|
||||
Application.Current.Dispatcher.Invoke(() => {
|
||||
PptApplication_PresentationOpen(null);
|
||||
});
|
||||
|
||||
|
||||
//如果检测到已经开始放映,则立即进入画板模式
|
||||
// 如果检测到已经开始放映,则立即进入画板模式
|
||||
if (pptApplication.SlideShowWindows.Count >= 1) {
|
||||
Application.Current.Dispatcher.Invoke(() => {
|
||||
PptApplication_SlideShowBegin(pptApplication.SlideShowWindows[1]);
|
||||
@@ -1048,36 +1023,47 @@ namespace Ink_Canvas {
|
||||
}
|
||||
}
|
||||
|
||||
private async void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e) {
|
||||
try {
|
||||
Application.Current.Dispatcher.Invoke(() => {
|
||||
try {
|
||||
var ms = new MemoryStream();
|
||||
inkCanvas.Strokes.Save(ms);
|
||||
ms.Position = 0;
|
||||
memoryStreams[pptApplication.SlideShowWindows[1].View.CurrentShowPosition] = ms;
|
||||
timeMachine.ClearStrokeHistory();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
|
||||
}
|
||||
});
|
||||
|
||||
new Thread(new ThreadStart(() => {
|
||||
try {
|
||||
pptApplication.SlideShowWindows[1].View.Exit();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
|
||||
}
|
||||
})).Start();
|
||||
private void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 检查 PowerPoint 进程是否还在运行
|
||||
var pptProcesses = Process.GetProcessesByName("POWERPNT");
|
||||
var wpsProcessesCheck = Process.GetProcessesByName("wpp");
|
||||
bool isWpsMode = Settings.PowerPointSettings.IsSupportWPS && wpsProcessesCheck.Length > 0;
|
||||
if ((isWpsMode && wpsProcessesCheck.Length == 0) || (!isWpsMode && pptProcesses.Length == 0))
|
||||
{
|
||||
LogHelper.WriteLogToFile("PowerPoint/WPS 进程已关闭,无法结束幻灯片放映", LogHelper.LogType.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
HideSubPanels("cursor");
|
||||
await Task.Delay(150);
|
||||
ViewboxFloatingBarMarginAnimation(100, true);
|
||||
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
|
||||
{
|
||||
LogHelper.WriteLogToFile("SlideShowView 对象无效,无法结束幻灯片放映", LogHelper.LogType.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {
|
||||
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.WriteLogToFile($"结束幻灯片放映时发生异常: {ex.ToString()}", LogHelper.LogType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Ink_Canvas.Helpers;
|
||||
using Ink_Canvas.Helpers;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.IO;
|
||||
@@ -20,7 +20,7 @@ namespace Ink_Canvas {
|
||||
SaveInkCanvasStrokes(true, true);
|
||||
}
|
||||
|
||||
private void SaveInkCanvasStrokes(bool newNotice = true, bool saveByUser = false) {
|
||||
private void SaveInkCanvasStrokes(Boolean newNotice, Boolean saveByUser) {
|
||||
try {
|
||||
var savePath = Settings.Automation.AutoSavedStrokesLocation
|
||||
+ (saveByUser ? @"\User Saved - " : @"\Auto Saved - ")
|
||||
@@ -33,8 +33,36 @@ namespace Ink_Canvas {
|
||||
else
|
||||
//savePathWithName = savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".icstk";
|
||||
savePathWithName = savePath + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + ".icstk";
|
||||
var fs = new FileStream(savePathWithName, FileMode.Create);
|
||||
inkCanvas.Strokes.Save(fs);
|
||||
|
||||
try {
|
||||
using (FileStream fs = new FileStream(savePathWithName, FileMode.Create)) { // 修复未定义的filePath引用
|
||||
inkCanvas.Strokes.Save(fs);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) when (ex is UnauthorizedAccessException || ex is DirectoryNotFoundException) {
|
||||
var docPath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
|
||||
"Auto Saved - Annotation Strokes",
|
||||
DateTime.Now.ToString("yyyyMMdd"),
|
||||
Path.GetFileNameWithoutExtension(savePathWithName) + "_retry.icstk"); // 使用正确的原始文件名
|
||||
|
||||
try {
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(docPath));
|
||||
using (FileStream fs = new FileStream(docPath, FileMode.Create)) {
|
||||
inkCanvas.Strokes.Save(fs);
|
||||
savePathWithName = docPath; // 更新通知使用的路径变量
|
||||
}
|
||||
}
|
||||
catch (Exception fallbackEx) {
|
||||
ShowNotification($"墨迹保存失败: {fallbackEx.Message}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {
|
||||
ShowNotification($"墨迹保存失败: {ex.Message}");
|
||||
return;
|
||||
}
|
||||
|
||||
if (newNotice) ShowNotification("墨迹成功保存至 " + savePathWithName);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
|
||||
namespace Ink_Canvas {
|
||||
@@ -35,17 +36,49 @@ namespace Ink_Canvas {
|
||||
using (var memoryGraphics = System.Drawing.Graphics.FromImage(bitmap)) {
|
||||
memoryGraphics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, System.Drawing.CopyPixelOperation.SourceCopy);
|
||||
|
||||
// 确保目录存在
|
||||
var directory = Path.GetDirectoryName(savePath);
|
||||
if (!Directory.Exists(directory)) {
|
||||
Directory.CreateDirectory(directory);
|
||||
}
|
||||
|
||||
bitmap.Save(savePath, ImageFormat.Png);
|
||||
|
||||
try {
|
||||
// 新增双重目录检查
|
||||
Directory.CreateDirectory(directory); // 防止多线程场景下的竞争条件
|
||||
bitmap.Save(savePath, ImageFormat.Png);
|
||||
}
|
||||
catch (Exception ex) when (ex is IOException ||
|
||||
ex is UnauthorizedAccessException ||
|
||||
ex is ExternalException) { // 新增GDI+异常捕获
|
||||
// 改进备用路径处理
|
||||
var docPath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
|
||||
"Auto Saved - Screenshots",
|
||||
DateTime.Now.ToString("yyyyMMdd"),
|
||||
Path.GetFileNameWithoutExtension(savePath) + "_retry.png"); // 添加重试后缀
|
||||
|
||||
try {
|
||||
var docDir = Path.GetDirectoryName(docPath);
|
||||
Directory.CreateDirectory(docDir);
|
||||
bitmap.Save(docPath, ImageFormat.Png);
|
||||
savePath = docPath;
|
||||
}
|
||||
catch (Exception fallbackEx) {
|
||||
// 最终错误处理
|
||||
if (!isHideNotification) {
|
||||
ShowNotification($"截图保存失败: {fallbackEx.Message}");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!isHideNotification) {
|
||||
ShowNotification($"截图成功保存至 {savePath}");
|
||||
try {
|
||||
ShowNotification($"截图成功保存至 {savePath}");
|
||||
}
|
||||
catch {
|
||||
// 防止通知系统自身异常导致崩溃
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,20 +90,39 @@ namespace Ink_Canvas {
|
||||
|
||||
var basePath = Settings.Automation.AutoSavedStrokesLocation;
|
||||
var dateFolder = DateTime.Now.ToString("yyyyMMdd");
|
||||
|
||||
return Path.Combine(
|
||||
var fullPath = Path.Combine(
|
||||
basePath,
|
||||
"Auto Saved - Screenshots",
|
||||
dateFolder,
|
||||
$"{fileName}.png");
|
||||
dateFolder);
|
||||
|
||||
try {
|
||||
if (!Directory.Exists(fullPath)) {
|
||||
Directory.CreateDirectory(fullPath);
|
||||
}
|
||||
}
|
||||
catch (Exception) {
|
||||
// 如果创建失败则使用文档目录
|
||||
basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
|
||||
fullPath = Path.Combine(basePath, "Auto Saved - Screenshots", dateFolder);
|
||||
Directory.CreateDirectory(fullPath);
|
||||
}
|
||||
|
||||
return Path.Combine(fullPath, $"{fileName}.png");
|
||||
}
|
||||
|
||||
// 获取默认文件夹路径
|
||||
private string GetDefaultFolderPath() {
|
||||
var basePath = Settings.Automation.AutoSavedStrokesLocation;
|
||||
var screenshotsFolder = Path.Combine(basePath, "Auto Saved - Screenshots");
|
||||
|
||||
if (!Directory.Exists(screenshotsFolder)) {
|
||||
|
||||
try {
|
||||
if (!Directory.Exists(screenshotsFolder)) {
|
||||
Directory.CreateDirectory(screenshotsFolder);
|
||||
}
|
||||
}
|
||||
catch (Exception) {
|
||||
// 如果创建失败则使用文档目录
|
||||
basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
|
||||
screenshotsFolder = Path.Combine(basePath, "Auto Saved - Screenshots");
|
||||
Directory.CreateDirectory(screenshotsFolder);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user