C# Winform右键菜单打开,但如何使选定的项目显示出来?

3
我有一个C# WinForm应用程序,用于将文件存储在硬盘上的单独安全位置。我正在尝试通过添加右键上下文菜单来为程序添加功能,因此当用户在Windows中右键单击文件(或一组文件)时,我的程序就会出现在上下文中供他们选择。这部分没有问题,我已经解决了这个问题。我需要编程获取文件列表并将其发送到程序,以便它们已经在列表框中列出。
我已经在OFD中使用多选项执行类似的操作,但我不希望他们必须打开程序、选择浏览、找到文件并选择它们,当他们已经在Windows中选择了它们。
有很多程序具有此功能(如属性加、textpad等),我只需要推动正确的方向,帮助我解决这个问题。
提前致谢,
戴夫

你可能在谈论“shell扩展处理程序”。.NET完全不支持它。通过在Google中搜索引号内的字符串,你可以找到相关信息。 - Hans Passant
3个回答

3
如果我正确理解了您已经实现的内容,那么所有文件应该出现在程序的命令行参数中。您只需要一种方法来提取每个文件路径并在列表视图中显示它们。
在C#中,下面的代码将显示一个包含命令行上每个参数的消息框:
static void Main(string[] args)
{
    foreach(string arg in args)
    {
        MessageBox.Show(arg);
    }
}

但是如果您不想在Main方法中访问这些内容,也可以使用Environment类,该类提供了静态的GetCommandLineArgs方法。它返回包含参数的相同字符串数组,您可以以相同的方式遍历它。


你很棒,谢谢...但是...现在我正在将每个参数添加到一个ArrayList中,并将该列表发送到一个类。它现在为每个参数打开了一个程序实例,而不是只为所有参数打开一次。我做错了什么导致这种情况发生? - Dave_P
请看我下面发布的答案。 - Dave_P

0
我正在收集所有的参数并将它们发送到一个ArrayList中。
    static void Main(string[] args)
    {
        ArrayList myAL = new ArrayList();

        foreach (string arg in args)
        {
            myAL.Add(arg);
        }

        ALRec nalr = new ALRec();
        nalr.getArrList(myAL);

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

将其发送到ALRec类

class ALRec 
{
    ArrayList MyArrLst = new ArrayList();

    public void getArrList(ArrayList AL)
    {
        MyArrLst = AL;
    }
}

为什么我的应用程序启动了多个实例?

你的大写约定让语法高亮(和我)感到困惑。一般来说,局部变量和类级别变量采用驼峰式命名,而函数名称采用帕斯卡式命名。无论如何,这段代码肯定不会启动多个应用程序实例。Application.Run 命令只被调用一次,这意味着只启动了一个实例。问题显然在于您在 shell 中注册上下文菜单处理程序的方式。正如 Hans 所说,这可能是更困难的部分。我猜测 Windows 为每个实例创建了一个新的应用程序。 - Cody Gray
您可以将您选择的文件发送到命令行上的不同实例,而不是全部发送到同一个实例。您能展示一下您用来将应用程序添加到注册表作为文件处理程序的代码吗? - Cody Gray
我所做的唯一注册表工作就是添加shell命令。hklm\software\classes*\shell"上下文菜单名称"\command。在command中设置的字符串值为- app.exe "%1",由于我将app.exe放在system32文件夹中,因此我不必指定路径。 - Dave_P
...而且你是对的,只有在选择多个文件时才会启动应用程序的多个实例。我还没有到达这一点,看看它是否将一个文件添加到每个实例中(而不是所有文件都在一个实例中或其他什么情况)。 - Dave_P
@Dave_P:首先,你将应用程序添加到了system32。那个文件夹不是用于应用程序的。整个Windows文件夹都是禁止访问的。第二个问题是你添加处理程序到注册表的方式。这是一种完全有效(也是最简单)的方法,但缺点是它会为每个注册的文件打开一个新的应用程序实例来处理。它不知道它应该将它们全部传递给同一个应用程序。你可以选择10个不同的文件类型,它们都将在它们自己的已注册处理程序应用中打开。 - Cody Gray
这个问题提供了一种替代方法的信息,可以让你在应用程序的单个实例中打开多个选定的文件:https://dev59.com/gVDTa4cB1Zd3GeqPGiXQ - Cody Gray

0

这是一篇关于如何在Windows中自定义右键菜单选项的文章。

然后就像 #CodyGray 所说的那样,在你的程序的Main方法中使用string[] args来获取文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接