Initial commit to new repository
This commit is contained in:
101
src/AxCopilot/Services/ShellExtensionService.cs
Normal file
101
src/AxCopilot/Services/ShellExtensionService.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace AxCopilot.Services;
|
||||
|
||||
/// <summary>
|
||||
/// Windows 탐색기 우클릭 메뉴에 AX Copilot 항목을 등록/해제합니다.
|
||||
/// 파일/폴더 선택 → 우클릭 → "AX Agent로 분석" 메뉴를 추가합니다.
|
||||
/// HKCU\Software\Classes 기반이므로 관리자 권한 불필요.
|
||||
/// </summary>
|
||||
public static class ShellExtensionService
|
||||
{
|
||||
private const string MenuKey = "AxCopilotShell";
|
||||
private const string MenuLabel = "AX Agent로 분석";
|
||||
|
||||
/// <summary>파일 우클릭 메뉴에 AX Agent 항목을 등록합니다.</summary>
|
||||
public static bool Register()
|
||||
{
|
||||
try
|
||||
{
|
||||
var exePath = Process.GetCurrentProcess().MainModule?.FileName ?? "";
|
||||
if (string.IsNullOrEmpty(exePath)) return false;
|
||||
|
||||
// 파일 우클릭: HKCU\Software\Classes\*\shell\AxCopilotShell
|
||||
RegisterContextMenu(@"Software\Classes\*\shell", exePath, "--analyze-file \"%1\"");
|
||||
|
||||
// 폴더 우클릭: HKCU\Software\Classes\Directory\shell\AxCopilotShell
|
||||
RegisterContextMenu(@"Software\Classes\Directory\shell", exePath, "--analyze-folder \"%1\"");
|
||||
|
||||
// 폴더 배경 우클릭: HKCU\Software\Classes\Directory\Background\shell\AxCopilotShell
|
||||
RegisterContextMenu(@"Software\Classes\Directory\Background\shell", exePath, "--analyze-folder \"%V\"");
|
||||
|
||||
LogService.Info("셸 확장 등록 완료");
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogService.Error($"셸 확장 등록 실패: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>등록된 우클릭 메뉴를 해제합니다.</summary>
|
||||
public static bool Unregister()
|
||||
{
|
||||
try
|
||||
{
|
||||
DeleteKey(@"Software\Classes\*\shell\" + MenuKey);
|
||||
DeleteKey(@"Software\Classes\Directory\shell\" + MenuKey);
|
||||
DeleteKey(@"Software\Classes\Directory\Background\shell\" + MenuKey);
|
||||
LogService.Info("셸 확장 해제 완료");
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogService.Error($"셸 확장 해제 실패: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>셸 확장이 등록되어 있는지 확인합니다.</summary>
|
||||
public static bool IsRegistered()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.CurrentUser.OpenSubKey(@"Software\Classes\*\shell\" + MenuKey);
|
||||
return key != null;
|
||||
}
|
||||
catch { return false; }
|
||||
}
|
||||
|
||||
private static void RegisterContextMenu(string basePath, string exePath, string args)
|
||||
{
|
||||
var menuPath = $@"{basePath}\{MenuKey}";
|
||||
using var menuKey = Registry.CurrentUser.CreateSubKey(menuPath);
|
||||
if (menuKey == null) return;
|
||||
|
||||
menuKey.SetValue("", MenuLabel);
|
||||
menuKey.SetValue("Icon", $"\"{exePath}\",0");
|
||||
|
||||
using var cmdKey = Registry.CurrentUser.CreateSubKey($@"{menuPath}\command");
|
||||
cmdKey?.SetValue("", $"\"{exePath}\" {args}");
|
||||
}
|
||||
|
||||
private static void DeleteKey(string path)
|
||||
{
|
||||
try { Registry.CurrentUser.DeleteSubKeyTree(path, false); } catch { }
|
||||
}
|
||||
|
||||
/// <summary>앱 시작 시 명령줄 인수를 처리합니다.</summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user