diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index bb14cf9c..00000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Codegeex.RepoIndex": true
-}
\ No newline at end of file
diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs
index fa60e53b..3ce93473 100644
--- a/Ink Canvas/App.xaml.cs
+++ b/Ink Canvas/App.xaml.cs
@@ -123,11 +123,27 @@ namespace Ink_Canvas
if (baseKey == null)
{
LogHelper.WriteLogToFile($"注册表路径不存在: {regPath}", LogHelper.LogType.Warning);
+ // 尝试创建路径
+ try
+ {
+ using (Microsoft.Win32.RegistryKey createKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(regPath, true))
+ {
+ if (createKey != null)
+ {
+ createKey.SetValue("DisableProtectedView", 1, Microsoft.Win32.RegistryValueKind.DWord);
+ LogHelper.WriteLogToFile($"创建并设置注册表路径: {regPath}", LogHelper.LogType.Info);
+ }
+ }
+ }
+ catch (Exception createEx)
+ {
+ LogHelper.WriteLogToFile($"创建注册表路径失败: {createEx.Message}", LogHelper.LogType.Error);
+ }
continue;
}
- Settings settingsInstance = new Settings();
- string backupPath = Path.Combine(settingsInstance.Automation.AutoSavedStrokesLocation, "RegistryBackups");
+ // 备份路径更改为软件根目录下的saves/RegistryBackups文件夹
+ string backupPath = Path.Combine(RootPath, "saves", "RegistryBackups");
LogHelper.WriteLogToFile($"备份路径: {backupPath}");
if (!Directory.Exists(backupPath))
@@ -176,6 +192,9 @@ namespace Ink_Canvas
continue;
}
}
+
+ // 处理Office 365的特殊路径
+ TryModifyOffice365Registry();
}
catch (SecurityException secEx)
{
@@ -321,14 +340,72 @@ namespace Ink_Canvas
{
try
{
- // 检查注册表判断Office是否存在
+ // 检查多个可能的注册表路径
+ // 1. 检查传统的Office版本
using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office"))
{
- return key?.GetValueNames().Any(name => name.Contains(".0")) ?? false;
+ if (key != null && key.GetSubKeyNames().Any(name => name.Contains(".0")))
+ {
+ LogHelper.WriteLogToFile("检测到传统Office安装", LogHelper.LogType.Info);
+ return true;
+ }
}
+
+ // 2. 检查64位注册表中的Office
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Microsoft\\Office"))
+ {
+ if (key != null && key.GetSubKeyNames().Any(name => name.Contains(".0")))
+ {
+ LogHelper.WriteLogToFile("检测到64位注册表中的Office安装", LogHelper.LogType.Info);
+ return true;
+ }
+ }
+
+ // 3. 检查Office 365/Click-to-Run安装
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun"))
+ {
+ if (key != null)
+ {
+ LogHelper.WriteLogToFile("检测到Office 365 Click-to-Run", LogHelper.LogType.Info);
+ return true;
+ }
+ }
+
+ // 4. 检查Office 365部署配置
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\15.0\\ClickToRun"))
+ {
+ if (key != null)
+ {
+ LogHelper.WriteLogToFile("检测到Office 365 (15.0)", LogHelper.LogType.Info);
+ return true;
+ }
+ }
+
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\16.0\\ClickToRun"))
+ {
+ if (key != null)
+ {
+ LogHelper.WriteLogToFile("检测到Office 365 (16.0)", LogHelper.LogType.Info);
+ return true;
+ }
+ }
+
+ // 5. 检查Office 365零售订阅信息
+ using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun\\Configuration"))
+ {
+ if (key != null)
+ {
+ LogHelper.WriteLogToFile("检测到Office 365配置", LogHelper.LogType.Info);
+ return true;
+ }
+ }
+
+ LogHelper.WriteLogToFile("未检测到任何Office安装", LogHelper.LogType.Warning);
+ return false;
}
- catch
+ catch (Exception ex)
{
+ LogHelper.WriteLogToFile($"检查Office安装时出错: {ex.Message}", LogHelper.LogType.Error);
return false;
}
}
@@ -398,6 +475,16 @@ namespace Ink_Canvas
}
}
}
+
+ // 检查Office 365的特殊路径
+ CheckOffice365Versions(versions);
+
+ // 如果没有找到任何版本,添加默认的Office 365版本号
+ if (versions.Count == 0 && IsOffice365Installed())
+ {
+ versions.Add("16.0");
+ LogHelper.WriteLogToFile("未找到具体版本,添加默认Office 365版本: 16.0");
+ }
}
catch (Exception ex)
{
@@ -421,5 +508,274 @@ namespace Ink_Canvas
return versions;
}
+
+ ///
+ /// 检测Office 365是否已安装
+ ///
+ private bool IsOffice365Installed()
+ {
+ try
+ {
+ // 检查多个Office 365特定路径
+ using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun"))
+ {
+ if (key != null)
+ return true;
+ }
+
+ using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\15.0\\ClickToRun"))
+ {
+ if (key != null)
+ return true;
+ }
+
+ using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\16.0\\ClickToRun"))
+ {
+ if (key != null)
+ return true;
+ }
+
+ using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun\\Configuration"))
+ {
+ if (key != null)
+ return true;
+ }
+
+ return false;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ ///
+ /// 检查Office 365特有的版本信息
+ ///
+ private void CheckOffice365Versions(List versions)
+ {
+ try
+ {
+ // 检查Click-to-Run版本路径
+ using (var key = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Office\\ClickToRun\\Configuration"))
+ {
+ if (key != null)
+ {
+ var platformVersion = key.GetValue("Platform") as string;
+ var clickToRunVersion = key.GetValue("VersionToReport") as string;
+
+ if (!string.IsNullOrEmpty(platformVersion))
+ {
+ var majorVersion = platformVersion.Split('.').FirstOrDefault();
+ if (!string.IsNullOrEmpty(majorVersion) && !versions.Contains($"{majorVersion}.0"))
+ {
+ versions.Add($"{majorVersion}.0");
+ LogHelper.WriteLogToFile($"在Office 365配置中找到平台版本: {majorVersion}.0");
+ }
+ }
+
+ if (!string.IsNullOrEmpty(clickToRunVersion))
+ {
+ var majorVersion = clickToRunVersion.Split('.').FirstOrDefault();
+ if (!string.IsNullOrEmpty(majorVersion) && !versions.Contains($"{majorVersion}.0"))
+ {
+ versions.Add($"{majorVersion}.0");
+ LogHelper.WriteLogToFile($"在Office 365配置中找到报告版本: {majorVersion}.0");
+ }
+ }
+ }
+ }
+
+ // 检查安装路径来确认版本
+ var possibleVersions = new[] { "15.0", "16.0" }; // Office 2013 (15.0) 和 Office 2016/2019/365 (16.0)
+ foreach (var version in possibleVersions)
+ {
+ using (var key = Registry.LocalMachine.OpenSubKey($"Software\\Microsoft\\Office\\{version}\\Common\\InstallRoot"))
+ {
+ if (key != null && key.GetValue("Path") != null && !versions.Contains(version))
+ {
+ versions.Add(version);
+ LogHelper.WriteLogToFile($"在InstallRoot中找到Office版本: {version}");
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"检查Office 365版本时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ ///
+ /// 尝试修改Office 365的特殊注册表路径
+ ///
+ private void TryModifyOffice365Registry()
+ {
+ try
+ {
+ // 准备备份目录
+ string backupPath = Path.Combine(RootPath, "saves", "RegistryBackups");
+ if (!Directory.Exists(backupPath))
+ {
+ Directory.CreateDirectory(backupPath);
+ LogHelper.WriteLogToFile($"创建Office 365备份目录: {backupPath}");
+ }
+
+ // 检查Office 365 Outlook和PowerPoint的特定路径
+ string[] apps = { "outlook", "powerpoint" };
+
+ foreach (var app in apps)
+ {
+ // 检查用户级别的注册表
+ string regPath = $"Software\\Microsoft\\Office\\16.0\\{app}\\Security";
+ LogHelper.WriteLogToFile($"检查Office 365特定应用注册表: {regPath}");
+
+ try
+ {
+ // 先检查是否存在该路径
+ using (var baseKey = Registry.CurrentUser.OpenSubKey(regPath))
+ {
+ // 如果路径存在,先备份
+ if (baseKey != null)
+ {
+ string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_{app}_{DateTime.Now:yyyyMMddHHmmss}.reg");
+ LogHelper.WriteLogToFile($"创建Office 365 {app}备份文件: {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($"备份Office 365 {app}注册表值: {valueName} = {value}");
+ }
+ }
+ }
+ }
+
+ // 修改或创建注册表项
+ using (var key = Registry.CurrentUser.CreateSubKey(regPath, true))
+ {
+ if (key != null)
+ {
+ object currentValue = key.GetValue("DisableProtectedView");
+ if (currentValue == null || (int)currentValue != 1)
+ {
+ key.SetValue("DisableProtectedView", 1, RegistryValueKind.DWord);
+ LogHelper.WriteLogToFile($"Office 365 {app} 注册表值已设置: DisableProtectedView = 1");
+ }
+ else
+ {
+ LogHelper.WriteLogToFile($"Office 365 {app} 注册表值已存在且无需更改");
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"修改 {app} 注册表时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+
+ // 尝试通过Office信任中心路径修改
+ string trustCenterPath = "Software\\Microsoft\\Office\\16.0\\Common\\Security\\FileValidation";
+ LogHelper.WriteLogToFile($"检查信任中心路径: {trustCenterPath}");
+
+ try
+ {
+ // 先检查是否存在该路径
+ using (var baseKey = Registry.CurrentUser.OpenSubKey(trustCenterPath))
+ {
+ // 如果路径存在,先备份
+ if (baseKey != null)
+ {
+ string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_TrustCenter_{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}\\{trustCenterPath}]");
+
+ foreach (string valueName in baseKey.GetValueNames())
+ {
+ object value = baseKey.GetValue(valueName);
+ sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}");
+ LogHelper.WriteLogToFile($"备份信任中心注册表值: {valueName} = {value}");
+ }
+ }
+ }
+ }
+
+ using (var key = Registry.CurrentUser.CreateSubKey(trustCenterPath, true))
+ {
+ if (key != null)
+ {
+ key.SetValue("DisableEditFromPV", 1, RegistryValueKind.DWord);
+ LogHelper.WriteLogToFile("已禁用受保护视图中的编辑");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"修改信任中心路径时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+
+ // 尝试修改EnableEditWhileViewingPolicy
+ string policyPath = "Software\\Policies\\Microsoft\\Office\\16.0\\Common\\Security";
+ try
+ {
+ // 先检查是否存在该路径
+ using (var baseKey = Registry.CurrentUser.OpenSubKey(policyPath))
+ {
+ // 如果路径存在,先备份
+ if (baseKey != null)
+ {
+ string backupFile = Path.Combine(backupPath, $"SecurityBackup_365_Policy_{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}\\{policyPath}]");
+
+ foreach (string valueName in baseKey.GetValueNames())
+ {
+ object value = baseKey.GetValue(valueName);
+ sw.WriteLine($"\"{valueName}\"=dword:{((int)value):x8}");
+ LogHelper.WriteLogToFile($"备份策略注册表值: {valueName} = {value}");
+ }
+ }
+ }
+ }
+
+ using (var key = Registry.CurrentUser.CreateSubKey(policyPath, true))
+ {
+ if (key != null)
+ {
+ key.SetValue("EnableEditWhileViewingPolicy", 1, RegistryValueKind.DWord);
+ LogHelper.WriteLogToFile("已启用查看时编辑策略");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"修改策略路径时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"修改Office 365注册表时发生未知错误: {ex.Message}", LogHelper.LogType.Error);
+ }
+ }
}
}