8

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

"C://myapp.exe "%1"

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

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

如果我想打开一个文件也没关系,但如果我选择多个文件,它会运行我的应用程序的多个实例。我只需要单个实例中所有选定文件的路径。谁能给我一个如何做到这一点的想法?

4

5 回答 5

1

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

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

所有路径都按预期复制!

于 2014-08-07T17:23:27.597 回答
1

我试过了,应用程序正在为每个选定的文件运行一个新实例。我什至尝试将“%2”“%3”等添加到注册表命令中,但也没有用。

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

于 2015-11-06T13:28:31.073 回答
0

虽然它要复杂得多,但我知道 Shell 扩展处理程序可以解决这个问题。
如何使用 .NET 语言编写 Windows Shell 扩展

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

祝你好运!

于 2013-09-11T19:00:31.653 回答
0

首先,我想告诉您的关于您的方法的最重要的事情是,使用您在注册表中创建的右键单击快捷方式绝对不可能获得多个文件路径。但是,这种方法有一些变通方法可能乐于助人;

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

  • 我说的第二种(推荐)方法有点棘手,因为它涉及使用您的应用程序创建一个附加组件以获取所有文件路径,但它确保您一次收到所有路径(没有多个实例)。第二个方法可能被称为外壳扩展。为了解释这种方法,让我解释一些先决条件(如果您已经了解它们,请不要犹豫跳过它们)。Shell 扩展是COM 服务器,它们在用户的计算机上注册,它们可以处理某种特定类型的文件。 cs.csproj(默认情况下都注册为使用 Visual Studio 打开)。Shell 扩展也称为上下文菜单处理程序. 注册的外壳扩展名或上下文菜单处理程序在注册要打开的文件扩展名收到来自 Windows 资源管理器的上下文菜单的右键单击后立即被调用。
    从广义上讲,shell 扩展或上下文菜单处理程序是一个注册的 COM 服务器,它以动态链接库的形式存在于用户的计算机中,如果注册的文件类型接收到右键单击选择或双击,则调用其函数。
    因此,我想您已经有足够的能力为 Shell Extensions 提供一个良好的开端。是一篇不错的分步文章,可为您提供一个不错的起点。

我想这会帮助你实现你的需要。如果还有什么,请告诉我。

于 2013-08-31T21:43:15.737 回答
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);
}
于 2014-09-26T05:22:58.080 回答