From 58028ea95c878dac6856bdff2267218fe2e4e8df Mon Sep 17 00:00:00 2001
From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com>
Date: Tue, 17 Jun 2025 13:20:06 +0800
Subject: [PATCH] fix:issue #13 #23
---
Ink Canvas/App.xaml.cs | 136 ++++++++++++++++++
Ink Canvas/MainWindow.xaml.cs | 10 +-
Ink Canvas/MainWindow_cs/MW_PPT.cs | 40 ------
.../MainWindow_cs/MW_SelectionGestures.cs | 7 +-
.../InkCanvasForClass.csproj.nuget.g.props | 2 +-
5 files changed, 151 insertions(+), 44 deletions(-)
diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs
index 1cc27889..e185c88a 100644
--- a/Ink Canvas/App.xaml.cs
+++ b/Ink Canvas/App.xaml.cs
@@ -4,10 +4,13 @@ using iNKORE.UI.WPF.Modern.Controls;
using System;
using System.Diagnostics;
using System.Threading;
+using Microsoft.Win32;
+using System.Security; // 添加SecurityException所需命名空间
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
+using System.Windows.Threading;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using MessageBox = System.Windows.MessageBox;
using Window = System.Windows.Window;
@@ -86,6 +89,110 @@ namespace Ink_Canvas
_taskbar = (TaskbarIcon)FindResource("TaskbarTrayIcon");
StartArgs = e.Args;
+
+ // 新增:Office注册表检测
+ try
+ {
+ LogHelper.WriteLogToFile("开始Office注册表检测");
+
+ // 检查Office安装
+ if (!IsOfficeInstalled())
+ {
+ LogHelper.WriteLogToFile("未检测到Office安装", LogHelper.LogType.Warning);
+ return;
+ }
+
+ var pptApplication = new Microsoft.Office.Interop.PowerPoint.Application();
+ string officeVersion = pptApplication.Version;
+ LogHelper.WriteLogToFile($"检测到Office版本: {officeVersion}");
+
+ string regPath = $"Software\\Microsoft\\Office\\{officeVersion}\\Common\\Security";
+ LogHelper.WriteLogToFile($"注册表路径: {regPath}");
+
+ using (Microsoft.Win32.RegistryKey baseKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(regPath))
+ {
+ if (baseKey == null)
+ {
+ LogHelper.WriteLogToFile($"注册表路径不存在: {regPath}", LogHelper.LogType.Warning);
+ return;
+ }
+
+ Settings settingsInstance = new Settings();
+ string backupPath = Path.Combine(settingsInstance.Automation.AutoSavedStrokesLocation, "RegistryBackups");
+ LogHelper.WriteLogToFile($"备份路径: {backupPath}");
+
+ if (!Directory.Exists(backupPath))
+ {
+ Directory.CreateDirectory(backupPath);
+ LogHelper.WriteLogToFile($"创建备份目录: {backupPath}");
+ }
+
+ string backupFile = Path.Combine(backupPath, $"SecurityBackup_{DateTime.Now:yyyyMMddHHmmss}.reg");
+ LogHelper.WriteLogToFile($"创建备份文件: {backupFile}");
+
+ // 使用UTF8编码写入注册表文件
+ using (StreamWriter sw = new StreamWriter(backupFile, false, System.Text.Encoding.UTF8))
+ {
+ sw.WriteLine("Windows Registry Editor Version 5.00\n");
+ sw.WriteLine();
+ sw.WriteLine($"[{Microsoft.Win32.Registry.CurrentUser.Name}\\{regPath}]");
+
+ foreach (string valueName in baseKey.GetValueNames())
+ {
+ object value = baseKey.GetValue(valueName);
+ sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}");
+ LogHelper.WriteLogToFile($"备份注册表值: {valueName} = {value}");
+ }
+ }
+
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(regPath, true))
+ {
+ // 仅在值不存在或不等于1时更新
+ object currentValue = key.GetValue("DisableProtectedView");
+ if (currentValue == null || (int)currentValue != 1)
+ {
+ key.SetValue("DisableProtectedView", 1, Microsoft.Win32.RegistryValueKind.DWord);
+ LogHelper.WriteLogToFile("注册表值已设置: DisableProtectedView = 1");
+ }
+ else
+ {
+ LogHelper.WriteLogToFile("注册表值已存在且无需更改: DisableProtectedView = 1");
+ }
+ }
+ }
+ }
+ catch (System.Runtime.InteropServices.COMException comEx) when (comEx.ErrorCode == -2147221040)
+ {
+ // 处理特定的COM错误(如Office未安装)
+ LogHelper.WriteLogToFile($"Office COM错误: 未安装PowerPoint (HRESULT: 0x{comEx.ErrorCode:x8})", LogHelper.LogType.Error);
+ }
+ catch (System.Runtime.InteropServices.COMException comEx)
+ {
+ LogHelper.WriteLogToFile($"Office COM错误: {comEx.Message} (HRESULT: 0x{comEx.ErrorCode:x8})", LogHelper.LogType.Error);
+ }
+ catch (SecurityException secEx)
+ {
+ LogHelper.WriteLogToFile($"安全异常: {secEx.Message}", LogHelper.LogType.Error);
+ ShowPermissionError();
+ }
+ catch (UnauthorizedAccessException authEx)
+ {
+ LogHelper.WriteLogToFile($"访问被拒绝: {authEx.Message}", LogHelper.LogType.Error);
+ ShowPermissionError();
+ }
+ catch (DirectoryNotFoundException dirEx)
+ {
+ LogHelper.WriteLogToFile($"目录未找到: {dirEx.Message}", LogHelper.LogType.Error);
+ }
+ catch (IOException ioEx)
+ {
+ LogHelper.WriteLogToFile($"IO错误: {ioEx.Message}", LogHelper.LogType.Error);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"未知错误: {ex.GetType().FullName} - {ex.Message}", LogHelper.LogType.Error);
+ LogHelper.WriteLogToFile(ex.StackTrace, LogHelper.LogType.Info);
+ }
}
private void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
@@ -207,5 +314,34 @@ namespace Ink_Canvas
}
catch { }
}
+
+ ///
+ /// 检查Office是否安装
+ ///
+ private bool IsOfficeInstalled()
+ {
+ try
+ {
+ // 检查注册表判断Office是否存在
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office"))
+ {
+ return key?.GetValueNames().Any(name => name.Contains(".0")) ?? false;
+ }
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ ///
+ /// 显示权限不足的错误提示
+ ///
+ private void ShowPermissionError()
+ {
+ const string message = "需要管理员权限才能完成此操作\n请以管理员身份重新启动应用程序";
+ LogHelper.WriteLogToFile(message, LogHelper.LogType.Error);
+ System.Windows.MessageBox.Show(message, "权限错误", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
}
}
diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs
index f735a141..668f62bf 100644
--- a/Ink Canvas/MainWindow.xaml.cs
+++ b/Ink Canvas/MainWindow.xaml.cs
@@ -365,9 +365,15 @@ namespace Ink_Canvas {
private void inkCanvas_TouchDown(object sender, TouchEventArgs e)
{
// 修改:根据用户设置决定是否强制显示自定义光标
- if (Settings.Canvas.IsShowCursor) {
+ if (Settings.Canvas.IsShowCursor)
+ {
inkCanvas.ForceCursor = true;
- } else {
+ // 新增:当处于套索选择模式时保持光标可见
+ if (inkCanvas.EditingMode == InkCanvasEditingMode.Select)
+ inkCanvas.Cursor = Cursors.Cross;
+ }
+ else
+ {
inkCanvas.ForceCursor = false;
System.Windows.Forms.Cursor.Show();
}
diff --git a/Ink Canvas/MainWindow_cs/MW_PPT.cs b/Ink Canvas/MainWindow_cs/MW_PPT.cs
index c13e9cb1..eaae3e43 100644
--- a/Ink Canvas/MainWindow_cs/MW_PPT.cs
+++ b/Ink Canvas/MainWindow_cs/MW_PPT.cs
@@ -69,46 +69,6 @@ namespace Ink_Canvas {
}
}
if (pptApplication == null) throw new Exception();
-
- // Office安装检测及注册表操作
- try {
- // 获取Office版本
- string officeVersion = pptApplication.Version;
- string regPath = $"Software\\Microsoft\\Office\\{officeVersion}\\Common\\Security";
-
- // 验证注册表路径有效性
- using (RegistryKey baseKey = Registry.CurrentUser.OpenSubKey(regPath)) {
- if (baseKey == null) {
- LogHelper.WriteLogToFile("注册表路径不存在: " + regPath, LogHelper.LogType.Warning);
- return;
- }
-
- // 备份注册表项
- string backupPath = Path.Combine(Settings.Automation.AutoSavedStrokesLocation, "RegistryBackups");
- if (!Directory.Exists(backupPath)) Directory.CreateDirectory(backupPath);
- string backupFile = Path.Combine(backupPath, $"SecurityBackup_{DateTime.Now:yyyyMMddHHmmss}.reg");
- using (StreamWriter sw = new StreamWriter(backupFile)) {
- sw.WriteLine($"Windows Registry Editor Version 5.00\n\n[{Registry.CurrentUser.Name}\\{regPath}]");
- foreach (string valueName in baseKey.GetValueNames()) {
- object value = baseKey.GetValue(valueName);
- sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}");
- }
- }
-
- // 处理DisableProtectedView值
- using (RegistryKey key = Registry.CurrentUser.CreateSubKey(regPath, true)) {
- if (key.GetValue("DisableProtectedView") == null) {
- key.CreateSubKey(regPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
- key.SetValue("DisableProtectedView", 1, RegistryValueKind.DWord);
- } else {
- key.SetValue("DisableProtectedView", 1, RegistryValueKind.DWord);
- }
- }
- }
- } catch (Exception regEx) {
- LogHelper.WriteLogToFile("注册表操作失败: " + regEx.ToString(), LogHelper.LogType.Error);
- }
-
StackPanelPPTControls.Visibility = Visibility.Visible;
}
catch (Exception ex) {
diff --git a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs
index b5cc24bd..ca679a1d 100644
--- a/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs
+++ b/Ink Canvas/MainWindow_cs/MW_SelectionGestures.cs
@@ -1,4 +1,4 @@
-using iNKORE.UI.WPF.Modern.Controls;
+using iNKORE.UI.WPF.Modern.Controls;
using System;
using System.Collections.Generic;
using System.Windows;
@@ -380,6 +380,11 @@ namespace Ink_Canvas {
isProgramChangeStrokeSelection = false;
inkCanvas.Strokes.Add(StrokesSelectionClone);
}
+ else {
+ // 新增:启动套索选择模式
+ inkCanvas.EditingMode = InkCanvasEditingMode.Select;
+ inkCanvas.Select(new StrokeCollection());
+ }
}
}
diff --git a/Ink Canvas/obj/InkCanvasForClass.csproj.nuget.g.props b/Ink Canvas/obj/InkCanvasForClass.csproj.nuget.g.props
index 088b2082..5edcea5e 100644
--- a/Ink Canvas/obj/InkCanvasForClass.csproj.nuget.g.props
+++ b/Ink Canvas/obj/InkCanvasForClass.csproj.nuget.g.props
@@ -7,7 +7,7 @@
$(UserProfile)\.nuget\packages\
C:\Users\Administrator\.nuget\packages\;E:\Program Files\Microsoft Visual Studio\Shared\NuGetPackages
PackageReference
- 6.13.2
+ 6.14.0