89 lines
3.3 KiB
C#
89 lines
3.3 KiB
C#
using Microsoft.Win32;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Security;
|
|
|
|
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;
|
|
string exePath = Process.GetCurrentProcess().MainModule.FileName;
|
|
return !string.IsNullOrEmpty(command) && command.Contains(exePath);
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
} |