add icons
This commit is contained in:
@@ -22,19 +22,33 @@ public static class ContextMenuRegistrar
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Вспомогательный метод для регистрации с прямой командой
|
#region Вспомогательные методы
|
||||||
|
|
||||||
private static void RegisterWithCommand(string rootPath, string menuName, string command, List<string> createdKeys)
|
private static string BuildCommand(string exePath, string prefix, string argument)
|
||||||
{
|
{
|
||||||
string shellPath = rootPath; // уже включает Shell, например @"SystemFileAssociations\.mp4\Shell"
|
prefix ??= "";
|
||||||
using (RegistryKey shellKey = Registry.ClassesRoot.CreateSubKey(shellPath))
|
return $"\"{exePath}\"{(string.IsNullOrEmpty(prefix) ? "" : " " + prefix)} {argument}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Возвращает путь к иконке для exe-методов
|
||||||
|
private static string? GetIconPath(string exePath, bool addIcon)
|
||||||
|
{
|
||||||
|
return addIcon ? $"{exePath},0" : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Регистрация с возможным указанием иконки (iconPath может быть null)
|
||||||
|
private static void RegisterWithCommand(string rootPath, string menuName, string command, List<string> createdKeys, string? iconPath = null)
|
||||||
|
{
|
||||||
|
using (RegistryKey shellKey = Registry.ClassesRoot.CreateSubKey(rootPath))
|
||||||
using (RegistryKey menuKey = shellKey.CreateSubKey(menuName))
|
using (RegistryKey menuKey = shellKey.CreateSubKey(menuName))
|
||||||
{
|
{
|
||||||
menuKey.SetValue(null, menuName);
|
menuKey.SetValue(null, menuName);
|
||||||
|
if (!string.IsNullOrWhiteSpace(iconPath))
|
||||||
|
menuKey.SetValue("Icon", iconPath!);
|
||||||
using RegistryKey commandKey = menuKey.CreateSubKey("command");
|
using RegistryKey commandKey = menuKey.CreateSubKey("command");
|
||||||
commandKey.SetValue(null, command);
|
commandKey.SetValue(null, command);
|
||||||
}
|
}
|
||||||
createdKeys.Add($@"{shellPath}\{menuName}");
|
createdKeys.Add($@"{rootPath}\{menuName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -44,17 +58,14 @@ public static class ContextMenuRegistrar
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для указанных расширений файлов, используя текущее приложение.
|
/// Регистрирует пункт меню для указанных расширений файлов, используя текущее приложение.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню (отображается в контекстном меню).</param>
|
/// <param name="menuName">Имя пункта меню.</param>
|
||||||
/// <param name="extensions">Коллекция расширений, например {".mp4", ".avi"}.</param>
|
/// <param name="extensions">Коллекция расширений, например {".mp4", ".avi"}.</param>
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки, передаваемый перед именем файла.</param>
|
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
/// <param name="addIcon">Если true, в качестве иконки используется текущее приложение (индекс 0).</param>
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или расширение.</exception>
|
public static void RegisterFileExtensions(string menuName, IEnumerable<string> extensions, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <exception cref="ArgumentNullException">extensions равно null.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации (выполнен откат).</exception>
|
|
||||||
public static void RegisterFileExtensions(string menuName, IEnumerable<string> extensions, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
||||||
RegisterFileExtensionsForExe(menuName, extensions, appPath, commandPrefix);
|
RegisterFileExtensionsForExe(menuName, extensions, appPath, commandPrefix, addIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -64,17 +75,15 @@ public static class ContextMenuRegistrar
|
|||||||
/// <param name="extensions">Коллекция расширений.</param>
|
/// <param name="extensions">Коллекция расширений.</param>
|
||||||
/// <param name="exePath">Полный путь к исполняемому файлу.</param>
|
/// <param name="exePath">Полный путь к исполняемому файлу.</param>
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
/// <param name="addIcon">Если true, в качестве иконки используется указанный exePath (индекс 0).</param>
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню, расширение или путь к exe.</exception>
|
public static void RegisterFileExtensionsForExe(string menuName, IEnumerable<string> extensions, string exePath, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <exception cref="ArgumentNullException">extensions равно null.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации (выполнен откат).</exception>
|
|
||||||
public static void RegisterFileExtensionsForExe(string menuName, IEnumerable<string> extensions, string exePath, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(exePath))
|
if (string.IsNullOrWhiteSpace(exePath))
|
||||||
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
||||||
commandPrefix ??= "";
|
commandPrefix ??= "";
|
||||||
string command = $"\"{exePath}\"{(string.IsNullOrEmpty(commandPrefix) ? "" : " " + commandPrefix)} \"%1\"";
|
string command = BuildCommand(exePath, commandPrefix, "\"%1\"");
|
||||||
RegisterFileExtensionsCommand(menuName, extensions, command);
|
string? iconPath = GetIconPath(exePath, addIcon);
|
||||||
|
RegisterFileExtensionsCommand(menuName, extensions, command, iconPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -82,12 +91,9 @@ public static class ContextMenuRegistrar
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
/// <param name="menuName">Имя пункта меню.</param>
|
||||||
/// <param name="extensions">Коллекция расширений.</param>
|
/// <param name="extensions">Коллекция расширений.</param>
|
||||||
/// <param name="command">Полная командная строка, которая будет записана в ключ "command".</param>
|
/// <param name="command">Полная командная строка.</param>
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
/// <param name="iconPath">Необязательный путь к иконке. Если не указан (null), иконка не добавляется.</param>
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню, расширение или пустая команда.</exception>
|
public static void RegisterFileExtensionsCommand(string menuName, IEnumerable<string> extensions, string command, string? iconPath = null)
|
||||||
/// <exception cref="ArgumentNullException">extensions равно null.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации (выполнен откат).</exception>
|
|
||||||
public static void RegisterFileExtensionsCommand(string menuName, IEnumerable<string> extensions, string command)
|
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
if (string.IsNullOrWhiteSpace(menuName))
|
if (string.IsNullOrWhiteSpace(menuName))
|
||||||
@@ -107,12 +113,11 @@ public static class ContextMenuRegistrar
|
|||||||
throw new ArgumentException($"Некорректное расширение: '{ext}'. Должно начинаться с точки.", nameof(extensions));
|
throw new ArgumentException($"Некорректное расширение: '{ext}'. Должно начинаться с точки.", nameof(extensions));
|
||||||
|
|
||||||
string shellPath = $@"SystemFileAssociations\{ext}\Shell";
|
string shellPath = $@"SystemFileAssociations\{ext}\Shell";
|
||||||
RegisterWithCommand(shellPath, menuName, command, createdKeys);
|
RegisterWithCommand(shellPath, menuName, command, createdKeys, iconPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// Откат: удаляем созданные ключи
|
|
||||||
foreach (string keyPath in createdKeys)
|
foreach (string keyPath in createdKeys)
|
||||||
{
|
{
|
||||||
try { Registry.ClassesRoot.DeleteSubKeyTree(keyPath, false); } catch { }
|
try { Registry.ClassesRoot.DeleteSubKeyTree(keyPath, false); } catch { }
|
||||||
@@ -124,12 +129,6 @@ public static class ContextMenuRegistrar
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удаляет ранее зарегистрированный пункт меню для указанных расширений файлов.
|
/// Удаляет ранее зарегистрированный пункт меню для указанных расширений файлов.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
|
||||||
/// <param name="extensions">Коллекция расширений.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или расширение.</exception>
|
|
||||||
/// <exception cref="ArgumentNullException">extensions равно null.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Не удалось удалить одно или несколько расширений.</exception>
|
|
||||||
public static void UnregisterFileExtensions(string menuName, IEnumerable<string> extensions)
|
public static void UnregisterFileExtensions(string menuName, IEnumerable<string> extensions)
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
@@ -149,7 +148,7 @@ public static class ContextMenuRegistrar
|
|||||||
{
|
{
|
||||||
Registry.ClassesRoot.DeleteSubKeyTree(keyPath, false);
|
Registry.ClassesRoot.DeleteSubKeyTree(keyPath, false);
|
||||||
}
|
}
|
||||||
catch (ArgumentException) { /* ключ не существует – игнорируем */ }
|
catch (ArgumentException) { }
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
errors.Add($"{ext}: {ex.Message}");
|
errors.Add($"{ext}: {ex.Message}");
|
||||||
@@ -166,44 +165,29 @@ public static class ContextMenuRegistrar
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для всех файлов, используя текущее приложение.
|
/// Регистрирует пункт меню для всех файлов, используя текущее приложение.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterAllFiles(string menuName, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterAllFiles(string menuName, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
||||||
RegisterAllFilesForExe(menuName, appPath, commandPrefix);
|
RegisterAllFilesForExe(menuName, appPath, commandPrefix, addIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для всех файлов с заданным исполняемым файлом.
|
/// Регистрирует пункт меню для всех файлов с заданным исполняемым файлом.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterAllFilesForExe(string menuName, string exePath, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <param name="exePath">Полный путь к исполняемому файлу.</param>
|
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или путь к exe.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterAllFilesForExe(string menuName, string exePath, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(exePath))
|
if (string.IsNullOrWhiteSpace(exePath))
|
||||||
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
||||||
commandPrefix ??= "";
|
commandPrefix ??= "";
|
||||||
string command = $"\"{exePath}\"{(string.IsNullOrEmpty(commandPrefix) ? "" : " " + commandPrefix)} \"%1\"";
|
string command = BuildCommand(exePath, commandPrefix, "\"%1\"");
|
||||||
RegisterAllFilesCommand(menuName, command);
|
string? iconPath = GetIconPath(exePath, addIcon);
|
||||||
|
RegisterAllFilesCommand(menuName, command, iconPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для всех файлов с заданной полной командой.
|
/// Регистрирует пункт меню для всех файлов с заданной полной командой.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterAllFilesCommand(string menuName, string command, string? iconPath = null)
|
||||||
/// <param name="command">Полная командная строка, которая будет записана в ключ "command".</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или пустая команда.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterAllFilesCommand(string menuName, string command)
|
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
if (string.IsNullOrWhiteSpace(menuName))
|
if (string.IsNullOrWhiteSpace(menuName))
|
||||||
@@ -215,7 +199,7 @@ public static class ContextMenuRegistrar
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string shellPath = @"*\Shell";
|
string shellPath = @"*\Shell";
|
||||||
RegisterWithCommand(shellPath, menuName, command, createdKeys);
|
RegisterWithCommand(shellPath, menuName, command, createdKeys, iconPath);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -230,9 +214,6 @@ public static class ContextMenuRegistrar
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удаляет пункт меню для всех файлов.
|
/// Удаляет пункт меню для всех файлов.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню.</exception>
|
|
||||||
public static void UnregisterAllFiles(string menuName)
|
public static void UnregisterAllFiles(string menuName)
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
@@ -252,46 +233,31 @@ public static class ContextMenuRegistrar
|
|||||||
#region Регистрация для папок (щелчок на иконке папки)
|
#region Регистрация для папок (щелчок на иконке папки)
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для папок (появляется при щелчке на иконке папки), используя текущее приложение.
|
/// Регистрирует пункт меню для папок, используя текущее приложение.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterFolderShell(string menuName, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterFolderShell(string menuName, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
||||||
RegisterFolderShellForExe(menuName, appPath, commandPrefix);
|
RegisterFolderShellForExe(menuName, appPath, commandPrefix, addIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для папок с заданным исполняемым файлом.
|
/// Регистрирует пункт меню для папок с заданным исполняемым файлом.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterFolderShellForExe(string menuName, string exePath, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <param name="exePath">Полный путь к исполняемому файлу.</param>
|
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или путь к exe.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterFolderShellForExe(string menuName, string exePath, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(exePath))
|
if (string.IsNullOrWhiteSpace(exePath))
|
||||||
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
||||||
commandPrefix ??= "";
|
commandPrefix ??= "";
|
||||||
string command = $"\"{exePath}\"{(string.IsNullOrEmpty(commandPrefix) ? "" : " " + commandPrefix)} \"%1\"";
|
string command = BuildCommand(exePath, commandPrefix, "\"%1\"");
|
||||||
RegisterFolderShellCommand(menuName, command);
|
string? iconPath = GetIconPath(exePath, addIcon);
|
||||||
|
RegisterFolderShellCommand(menuName, command, iconPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для папок с заданной полной командой.
|
/// Регистрирует пункт меню для папок с заданной полной командой.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterFolderShellCommand(string menuName, string command, string? iconPath = null)
|
||||||
/// <param name="command">Полная командная строка, которая будет записана в ключ "command".</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или пустая команда.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterFolderShellCommand(string menuName, string command)
|
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
if (string.IsNullOrWhiteSpace(menuName))
|
if (string.IsNullOrWhiteSpace(menuName))
|
||||||
@@ -303,7 +269,7 @@ public static class ContextMenuRegistrar
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string shellPath = @"Directory\Shell";
|
string shellPath = @"Directory\Shell";
|
||||||
RegisterWithCommand(shellPath, menuName, command, createdKeys);
|
RegisterWithCommand(shellPath, menuName, command, createdKeys, iconPath);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -316,11 +282,8 @@ public static class ContextMenuRegistrar
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удаляет пункт меню для папок (из раздела Shell).
|
/// Удаляет пункт меню для папок.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню.</exception>
|
|
||||||
public static void UnregisterFolderShell(string menuName)
|
public static void UnregisterFolderShell(string menuName)
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
@@ -337,52 +300,35 @@ public static class ContextMenuRegistrar
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Регистрация для фона папки (щелчок на свободном месте внутри папки)
|
#region Регистрация для фона папки
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для фона папки (появляется при щелчке на свободном месте внутри открытой папки),
|
/// Регистрирует пункт меню для фона папки, используя текущее приложение.
|
||||||
/// используя текущее приложение. В команде рекомендуется использовать параметр "%V" для передачи пути к текущей папке.
|
/// В команде рекомендуется использовать "%V".
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterFolderBackgroundShell(string menuName, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterFolderBackgroundShell(string menuName, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
string appPath = Process.GetCurrentProcess().MainModule.FileName;
|
||||||
RegisterFolderBackgroundShellForExe(menuName, appPath, commandPrefix);
|
RegisterFolderBackgroundShellForExe(menuName, appPath, commandPrefix, addIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для фона папки с заданным исполняемым файлом.
|
/// Регистрирует пункт меню для фона папки с заданным исполняемым файлом.
|
||||||
/// В команде рекомендуется использовать параметр "%V" для передачи пути к текущей папке.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterFolderBackgroundShellForExe(string menuName, string exePath, string commandPrefix = "", bool addIcon = false)
|
||||||
/// <param name="exePath">Полный путь к исполняемому файлу.</param>
|
|
||||||
/// <param name="commandPrefix">Необязательный префикс командной строки.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или путь к exe.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterFolderBackgroundShellForExe(string menuName, string exePath, string commandPrefix = "")
|
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(exePath))
|
if (string.IsNullOrWhiteSpace(exePath))
|
||||||
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
throw new ArgumentException("Путь к исполняемому файлу не может быть пустым.", nameof(exePath));
|
||||||
commandPrefix ??= "";
|
commandPrefix ??= "";
|
||||||
// Для фона папки рекомендуется %V
|
string command = BuildCommand(exePath, commandPrefix, "\"%V\"");
|
||||||
string command = $"\"{exePath}\"{(string.IsNullOrEmpty(commandPrefix) ? "" : " " + commandPrefix)} \"%V\"";
|
string? iconPath = GetIconPath(exePath, addIcon);
|
||||||
RegisterFolderBackgroundShellCommand(menuName, command);
|
RegisterFolderBackgroundShellCommand(menuName, command, iconPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Регистрирует пункт меню для фона папки с заданной полной командой.
|
/// Регистрирует пункт меню для фона папки с заданной полной командой.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
public static void RegisterFolderBackgroundShellCommand(string menuName, string command, string? iconPath = null)
|
||||||
/// <param name="command">Полная командная строка, которая будет записана в ключ "command". Рекомендуется использовать "%V".</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню или пустая команда.</exception>
|
|
||||||
/// <exception cref="InvalidOperationException">Ошибка при регистрации.</exception>
|
|
||||||
public static void RegisterFolderBackgroundShellCommand(string menuName, string command)
|
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
if (string.IsNullOrWhiteSpace(menuName))
|
if (string.IsNullOrWhiteSpace(menuName))
|
||||||
@@ -394,7 +340,7 @@ public static class ContextMenuRegistrar
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string shellPath = @"Directory\Background\Shell";
|
string shellPath = @"Directory\Background\Shell";
|
||||||
RegisterWithCommand(shellPath, menuName, command, createdKeys);
|
RegisterWithCommand(shellPath, menuName, command, createdKeys, iconPath);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -409,9 +355,6 @@ public static class ContextMenuRegistrar
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удаляет пункт меню для фона папки.
|
/// Удаляет пункт меню для фона папки.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="menuName">Имя пункта меню.</param>
|
|
||||||
/// <exception cref="UnauthorizedAccessException">Приложение не запущено от имени администратора.</exception>
|
|
||||||
/// <exception cref="ArgumentException">Некорректное имя меню.</exception>
|
|
||||||
public static void UnregisterFolderBackgroundShell(string menuName)
|
public static void UnregisterFolderBackgroundShell(string menuName)
|
||||||
{
|
{
|
||||||
CheckAdministrator();
|
CheckAdministrator();
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
Reference in New Issue
Block a user