106 lines
2.5 KiB
C#
106 lines
2.5 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using Microsoft.Win32;
|
|
|
|
namespace AxCopilot.Services;
|
|
|
|
public static class ShellExtensionService
|
|
{
|
|
private const string MenuKey = "AxCopilotShell";
|
|
|
|
private const string MenuLabel = "AX Agent로 분석";
|
|
|
|
public static bool Register()
|
|
{
|
|
try
|
|
{
|
|
string text = Process.GetCurrentProcess().MainModule?.FileName ?? "";
|
|
if (string.IsNullOrEmpty(text))
|
|
{
|
|
return false;
|
|
}
|
|
RegisterContextMenu("Software\\Classes\\*\\shell", text, "--analyze-file \"%1\"");
|
|
RegisterContextMenu("Software\\Classes\\Directory\\shell", text, "--analyze-folder \"%1\"");
|
|
RegisterContextMenu("Software\\Classes\\Directory\\Background\\shell", text, "--analyze-folder \"%V\"");
|
|
LogService.Info("셸 확장 등록 완료");
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogService.Error("셸 확장 등록 실패: " + ex.Message);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool Unregister()
|
|
{
|
|
try
|
|
{
|
|
DeleteKey("Software\\Classes\\*\\shell\\AxCopilotShell");
|
|
DeleteKey("Software\\Classes\\Directory\\shell\\AxCopilotShell");
|
|
DeleteKey("Software\\Classes\\Directory\\Background\\shell\\AxCopilotShell");
|
|
LogService.Info("셸 확장 해제 완료");
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogService.Error("셸 확장 해제 실패: " + ex.Message);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool IsRegistered()
|
|
{
|
|
try
|
|
{
|
|
using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Software\\Classes\\*\\shell\\AxCopilotShell");
|
|
return registryKey != null;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private static void RegisterContextMenu(string basePath, string exePath, string args)
|
|
{
|
|
string text = basePath + "\\AxCopilotShell";
|
|
using RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(text);
|
|
if (registryKey == null)
|
|
{
|
|
return;
|
|
}
|
|
registryKey.SetValue("", "AX Agent로 분석");
|
|
registryKey.SetValue("Icon", "\"" + exePath + "\",0");
|
|
using RegistryKey registryKey2 = Registry.CurrentUser.CreateSubKey(text + "\\command");
|
|
registryKey2?.SetValue("", "\"" + exePath + "\" " + args);
|
|
}
|
|
|
|
private static void DeleteKey(string path)
|
|
{
|
|
try
|
|
{
|
|
Registry.CurrentUser.DeleteSubKeyTree(path, throwOnMissingSubKey: false);
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
public static (string Action, string Path)? ParseCommandLine(string[] args)
|
|
{
|
|
for (int i = 0; i < args.Length - 1; i++)
|
|
{
|
|
if (args[i] == "--analyze-file")
|
|
{
|
|
return ("file", args[i + 1]);
|
|
}
|
|
if (args[i] == "--analyze-folder")
|
|
{
|
|
return ("folder", args[i + 1]);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|