Щелкните правой кнопкой мыши каталог

Я разрабатываю программу C # WinForms, которая, когда пользователь щелкает правой кнопкой мыши по каталогу и выбирает элемент, который я добавил в контекстное меню оболочки (которое открывает .exe для моего приложения), он работает в фоновом режиме в зависимости от того, где пользователь прав клики.

Я уже понял, как его установить и добавить в правильное контекстное меню, но я не могу понять самую важную часть программы. Я уже смотрел здесь, но это не ответить на мой вопрос, и ответ, который он дает, просто приводит к другому вопросу.

Я также понимаю, что аргументы командной строки существуют, и именно так отвечается на этот вопрос. Когда я захожу на веб-сайт Microsoft об использовании аргументов командной строки, речь идет только об использовании фактической командной строки, которую я не использую.

Итак, мой вопрос:

Как именно я могу получить путь к каталогу, когда пользователь щелкает папку правой кнопкой мыши и выбирает контекстное меню оболочки, которое я добавил?

Если мне нужно использовать командную строку в фоновом режиме, это нормально, мне просто нужно иметь возможность получить и отправить путь к каталогу в мою программу.

Вот соответствующий код того, как я использую введенный каталог. По сути, источником является путь к каталогу, который я хочу, когда пользователь щелкает правой кнопкой мыши.

private void recursiveCheck(string source)
{
    string[] directories = Directory.GetDirectories(source);
    foreach(string directory in directories)
    {
        string test = new DirectoryInfo(directory).Name;
        if (test.Length >= 3 && (test.Substring(test.Length - 3).Equals("val", StringComparison.InvariantCultureIgnoreCase) || (test.Substring(test.Length - 3).Equals("ash", StringComparison.InvariantCultureIgnoreCase)))
        {
            if (Directory.Exists(directory + "\\STARTUP"))
                testing_dir(directory);
            else
            {
                MessageBox.Show("Error! Startup folder does not exist in: " + test);
                Application.Exit();
            }
        }
        else
            recursiveCheck(directory);
    }
}

person Fergie305    schedule 01.06.2018    source источник
comment
пожалуйста, включите соответствующий код в свой вопрос и немного объясните свою архитектуру: вы говорите о расширении оболочки Windows или у вас есть какой-то контроль над формой, в которой вы отображаете объекты файловой системы? это WPF или WinForms?   -  person Cee McSharpface    schedule 01.06.2018
comment
Мне кажется, вы должны использовать класс Process (найденный в System.Diagnostics). Он имеет возможность передавать аргументы и многое другое. Этот сайт является отличным ресурсом для этого: msdn.microsoft.com/en-us/library/   -  person Phil N DeBlanc    schedule 01.06.2018
comment
Как вы представляете список файлов .EXE? Это как вид на дерево?   -  person Icemanind    schedule 01.06.2018
comment
Система.Окружающая среда.Командная строка?   -  person Ctznkane525    schedule 02.06.2018
comment
Суть этого вопроса не в чтении аргументов командной строки, а в том, чтобы найти путь к папке, когда пользователь выбирает пункт контекстного меню оболочки, который добавлен в контекстное меню оболочки папки.   -  person Reza Aghaei    schedule 04.06.2018
comment
Официальный документ для командной строки оболочки находится здесь: msdn.microsoft .com/en-us/library/windows/desktop/, но он неполный. В старой статье от парня из Microsoft перечислено все. Это было написано здесь: superuser.com/questions/136838/   -  person Simon Mourier    schedule 04.06.2018


Ответы (1)


Я предполагаю, что вы добавили свое приложение в контекстное меню папок в реестре:

HKEY_CLASSES_ROOT
    Directory
        shell
            OpenWithMyApp  → (Default): Open With My App
                command    → (Default): "c:\myapp.exe" "%V"

Ключевой момент находится в %V. Это будет имя папки, которое вы щелкнули правой кнопкой мыши, и оно будет передано вашему приложению в качестве аргумента командной строки.

Тогда в вашем приложении достаточно иметь что-то вроде этого:

[STAThread]
static void Main()
{
    string folderName = null ;
    if (Environment.GetCommandLineArgs().Length > 1)
        folderName = Environment.GetCommandLineArgs()[1];
    MessageBox.Show(folderName);

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(true);
    Application.Run(new Form1());
}
person Reza Aghaei    schedule 02.06.2018
comment
Я проверил решение на себе. Дайте мне знать, если у вас возникнут проблемы с применением решения :) - person Reza Aghaei; 04.06.2018
comment
Да, это именно то, что мне было нужно! Большое спасибо! - person Fergie305; 04.06.2018