118 lines
4.7 KiB
C#
118 lines
4.7 KiB
C#
using Microsoft.Win32;
|
|
using System;
|
|
using System.Diagnostics;
|
|
|
|
namespace Ink_Canvas.Helpers
|
|
{
|
|
public static class UriSchemeHelper
|
|
{
|
|
private const string SchemeName = "icc";
|
|
private const string FriendlyName = "URL:Ink Canvas Protocol";
|
|
|
|
public static bool RegisterUriScheme()
|
|
{
|
|
try
|
|
{
|
|
string exePath = Process.GetCurrentProcess().MainModule.FileName;
|
|
|
|
// 使用 CurrentUser\Software\Classes 代替 ClassesRoot,无需管理员权限
|
|
using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"Software\Classes\" + SchemeName))
|
|
{
|
|
key.SetValue("", FriendlyName);
|
|
key.SetValue("URL Protocol", "");
|
|
|
|
using (RegistryKey defaultIconKey = key.CreateSubKey("DefaultIcon"))
|
|
{
|
|
// 修正引号转义
|
|
defaultIconKey.SetValue("", "\"" + exePath + "\",1");
|
|
}
|
|
|
|
using (RegistryKey shellKey = key.CreateSubKey("shell"))
|
|
using (RegistryKey openKey = shellKey.CreateSubKey("open"))
|
|
using (RegistryKey commandKey = openKey.CreateSubKey("command"))
|
|
{
|
|
// 修正引号转义
|
|
commandKey.SetValue("", "\"" + exePath + "\" \"%1\"");
|
|
}
|
|
}
|
|
LogHelper.WriteLogToFile($"成功注册URI Scheme: {SchemeName}://", LogHelper.LogType.Event);
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogHelper.WriteLogToFile($"注册URI Scheme失败: {ex.Message}", LogHelper.LogType.Error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool UnregisterUriScheme()
|
|
{
|
|
try
|
|
{
|
|
// 使用 CurrentUser\Software\Classes
|
|
Registry.CurrentUser.DeleteSubKeyTree(@"Software\Classes\" + SchemeName, false);
|
|
LogHelper.WriteLogToFile($"成功注销URI Scheme: {SchemeName}://", LogHelper.LogType.Event);
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogHelper.WriteLogToFile($"注销URI Scheme失败: {ex.Message}", LogHelper.LogType.Error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool IsUriSchemeRegistered()
|
|
{
|
|
try
|
|
{
|
|
// 使用 CurrentUser\Software\Classes
|
|
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Classes\" + SchemeName))
|
|
{
|
|
if (key == null) return false;
|
|
// 修正反斜杠路径
|
|
using (RegistryKey shellKey = key.OpenSubKey(@"shell\open\command"))
|
|
{
|
|
if (shellKey == null) return false;
|
|
string command = shellKey.GetValue("") as string;
|
|
if (string.IsNullOrEmpty(command)) return false;
|
|
|
|
// 提取第一个标记作为可执行文件路径(处理带引号的情况)
|
|
string registeredExePath = "";
|
|
if (command.StartsWith("\""))
|
|
{
|
|
int nextQuote = command.IndexOf("\"", 1);
|
|
if (nextQuote > 1)
|
|
{
|
|
registeredExePath = command.Substring(1, nextQuote - 1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int firstSpace = command.IndexOf(" ");
|
|
registeredExePath = firstSpace > 0 ? command.Substring(0, firstSpace) : command;
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(registeredExePath)) return false;
|
|
|
|
string currentExePath = Process.GetCurrentProcess().MainModule.FileName;
|
|
|
|
try
|
|
{
|
|
string normalizedRegisteredPath = System.IO.Path.GetFullPath(registeredExePath);
|
|
string normalizedCurrentPath = System.IO.Path.GetFullPath(currentExePath);
|
|
return string.Equals(normalizedRegisteredPath, normalizedCurrentPath, StringComparison.OrdinalIgnoreCase);
|
|
}
|
|
catch
|
|
{
|
|
return string.Equals(registeredExePath, currentExePath, StringComparison.OrdinalIgnoreCase);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
} |