右键单击获取多个文件路径

时间:2013-08-21 06:24:20

标签: c# .net

我已在注册表的帮助下将我的应用程序添加到Windows的右键菜单中

  

“C://myapp.exe”%1“

我可以使用以下代码在MessageBox中获取所选文件的路径。

static void Main(string[] args)
{
   foreach (string path in args)
   {
       MessageBox.Show(path);  
   }
}

如果我想打开一个文件,这是可以的,但如果我选择多个文件,它会运行我的应用程序的多个实例。我只需要单个实例中所有选定文件的路径。谁能让我知道如何做到这一点?

5 个答案:

答案 0 :(得分:1)

非编程解决方法,同时复制所有路径如下(在Windows 7上测试):

  1. 选择所需的文件。
  2. Shift +右键单击。
  3. 点击“复制为路径”(它显示为一个附加选项!)。
  4. 按预期复制所有路径!

答案 1 :(得分:1)

我尝试过,应用程序正在为每个选定的文件运行一个新实例。我甚至试图添加"%2" "%3"等注册表命令,也没用。

如果确实需要为所有文件运行单个实例,也许您可​​以使用从WindowsFormsApplicationBase派生的类来设置应用程序,设置IsSingleInstance属性并覆盖OnStartupNextInstance(没有链接到这导致我的声誉不允许超过2个链接)

答案 2 :(得分:0)

首先,我想告诉您关于您的方法的最重要的事情是,使用您使用注册表进行的右键快捷方式获取多个文件路径是绝对不可能的。但是有一些解决方法可以解决这个问题。可能有用的方法;

  • 如果您真的需要这么简单,那么您将不得不使用Mutex Class处理应用程序实例。如果您设法使用Mutex将应用程序实例限制为单一,这可能会为您提供一些帮助。要获得此方法为你工作,你必须将所有先前实例的命令行参数传递给最后一个实例。

我刚才解释的方法涉及到很多代码,可以在启动过程中获取所有文件路径,但第二种方法很容易适合这种情况,但它有点困难,需要的东西比你的可执行文件更多。

  • 我说的第二种(推荐)方法有点棘手,因为它涉及使用您的应用程序创建一个额外的组件来获取所有文件路径,但它确保您一次接收所有路径(没有多个实例)第二种方法可以标题为 Shell Extensions。为了解释这种方法,让我解释一些先决条件(如果你已经了解它们,请不要犹豫,跳过它们).Shell Extensions是{{3在用户的计算机上注册了一些他们可以处理的特定类型的文件,例如 .cs .csproj (两者都注册为使用Visual Studio打开默认).Shell Extensions也称为上下文菜单处理程序。已注册的shell扩展或contextmenu处理程序 一旦注册的文件扩展名被打开,就会在Windows资源管理器的上下文菜单中收到右键单击 从广义上讲,shell扩展或contextmenu处理程序是一个已注册的COM服务器,它以用户计算机中COM Servers的形式退出,如果注册的文件类型接收到右键单击选择或双击,则会调用其函数。登记/> 所以我猜你已经有足够的机会为Shell Extensions做好准备。Dynamic Link Library是一篇很好的分步文章,为你提供一个不错的起点。

我想这可以帮助您实现您的需求。如果还有什么,请告诉我。

答案 3 :(得分:0)

虽然它要复杂得多,但我知道Shell扩展处理程序可以解决这个问题 How to Write Windows Shell Extension with .NET Languages

我为Windows窗体应用程序编写了其中一个,当用户右键单击特定文件类型时,该应用程序会打开。它也适用于多个文件。

祝你好运!

答案 4 :(得分:0)

您的应用程序很可能没有自己运行多个实例,因为您告诉foreach循环显示每个路径的消息框,因此您只需获取多个消息框。您需要操纵一个字符串以包含所有路径,然后将它们插入到消息框中以显示。

static void Main(string[] args)
{
   foreach (string path in args)
   {
      MessageBox.Show(path);  
   }
}

static void Main(string[] args)
{
  string paths = "";
  foreach (string path in args)
  {
     paths += path + Environment.NewLine;
  }
  MessageBox.Show(path);
}