目录右键单击

时间:2018-06-01 14:06:41

标签: c# .net winforms contextmenu windows-shell

我正在设计一个C#WinForms程序,当用户右键单击一个目录并选择我添加到shell上下文菜单的项目(为我的应用程序打开.exe)时,它在后台运行用户点击的位置。

我已经想出如何安装它并将其添加到正确的上下文菜单中,但我似乎无法找出该程序中最关键的部分。我已经查看了here,但这并没有回答我的问题,它给出的答案只会导致另一个问题。

我也意识到存在命令行参数,这就是this question is answered.当我进入微软网站关于使用命令行参数的时候,它只是关于使用一个实际的命令行,我是不使用。

所以我的问题是:

当用户右键单击文件夹并选择我添加的shell上下文菜单时,我究竟如何获取目录路径?

如果我必须在后台使用命令行,那很好我只需要能够获取并将目录路径发送到我的程序。

以下是我如何使用输入目录的相关代码。本质上,source是用户右键单击时我想要的目录路径。

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);
    }
}

1 个答案:

答案 0 :(得分: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());
}