Регистрация контекстного меню подсказки CMD - PullRequest
0 голосов
/ 26 июня 2018

Я регистрирую команду контекстного меню, чтобы создать хеш-значение файла. Проблема, которую я имею, состоит в том, что зарегистрированная команда не держит окно результатов командной строки в поле зрения. Когда я щелкаю правой кнопкой мыши и вызываю «Создать хэш», результаты быстро мигают перед закрытием. Даже добавление pause ниже не оставляет результатов в поле зрения. Что-нибудь, что мне нужно добавить в раздел реестра, чтобы предотвратить закрытие окна?

static void Main(string[] args)
{
    string menuCommand = "CertUtil -hashfile \"%1\" pause";
    Register("*", "HashFile", "Create Hash", menuCommand);
}
public static void Register(
    string fileType, string shellKeyName,
    string menuText, string menuCommand)
{
    if (string.IsNullOrEmpty(fileType) ||
        string.IsNullOrEmpty(shellKeyName) ||
        string.IsNullOrEmpty(menuText) ||
        string.IsNullOrEmpty(menuCommand))
        return;

    string regPath = string.Format(@"{0}\shell\{1}", fileType, shellKeyName);

    using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(regPath))
    {
        key.SetValue(null, menuText);
    }

    using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(
        string.Format(@"{0}\command", regPath)))
    {
        key.SetValue(null, menuCommand);
    }
}

1 Ответ

0 голосов
/ 26 июня 2018

Одно быстрое и простое решение - обернуть CertUtil через ваше собственное консольное приложение и добавить его в реестр вместо для непосредственного запуска CertUtil.

Допустим, приведенный ниже код предназначен для CertUtilWrapper.

static void Main(string[] args)
{
    var proc = new Process 
    {
        StartInfo = new ProcessStartInfo 
        {
            FileName = "CertUtil.exe",
            Arguments = string.Join(" ", args)
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = true
        }
    }.Start();
    Console.WriteLine(proc.StandardOutput.ReadToEnd());
    Console.WriteLine(proc.StandardError.ReadToEnd());
    proc.WaitForExit();
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
};

Затем измените свой код на

static void Main(string[] args)
{
    string menuCommand = "CertUtilWrapper -hashfile \"%1\"";
    Register("*", "HashFile", "Create Hash", menuCommand);
}

Очевидно, для этого требуется, чтобы CertUtilWrapper был где-то в системе PATH, так же, как и сам CertUtil.

Есть и другие альтернативы. Вместо этого вы можете, например, вызвать cmd, командный файл или сценарий PowerShell.

Ниже описано, как это сделать, используя cmd. Это просто Обратите внимание, что переключатель /k необходим, чтобы держать окно открытым.

Обратите внимание, что побочным эффектом является сохранение окна cmd открытым вместе с приглашением (которое может сбить с толку конечных пользователей в зависимости от вашей аудитории). Мне лично этот недостаток не нравится.

static void Main(string[] args)
{
    string menuCommand = "cmd /k CertUtil -hashfile \"%1\"";
    Register("*", "HashFile", "Create Hash", menuCommand);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...