2013-08-21 29 views
8

我已经加入我的应用程序到Windows的右键菜单与注册表提供多个文件路径用右键单击

“C://myapp.exe‘的帮助下%1’

我可以使用下面的代码来获得所选择的文件在MessageBox路径。

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

这是好,如果我想打开一个文件,但如果我选择多个文件,它运行我的应用程序的多个实例。我只需要单个实例中所有选定文件的路径。任何人都可以给我一个如何做到这一点的想法?

+0

最新问题?你需要传入多个参数? – Sayse

+0

我不知道从“选择,右键单击,启动,选择另一个,右键单击,启动”中区分“多个选择,单击右键,启动” - 所以如果你很高兴,在这两种情况下,因为只有一个实例正在运行,所以您希望实现一个“单实例应用程序” - 尝试搜索这三个词加上c#。 –

+1

[打开所有文件时用户右键单击并选择“打开方式”](http://stackoverflow.com/questions/3158312/open-all-files-when-user-right-clicks-and-selects-打开) –

回答

0

首先,我想告诉你关于你的方法的最重要的事情是,绝对不可能通过你使用注册表制作的右键单击快捷方式来获得多个文件路径。但是,有一些解决方法这种方法可能有帮助;

  • 如果你真的需要这种简单的,那么你就必须处理使用Mutex Class。这,如果你设法限制您的应用程序实例使用Mutex.To得到这种方法工作单挑可以提供你一些帮助应用程序实例对于你来说,你必须将所有先前实例的命令行参数传递给最后一个实例。

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

  • 第二个(推荐)的方式,我说的是有点棘手,因为它涉及到创建与应用程序来获取所有文件路径的附加组件,但它可以确保您收到一气呵成的所有路径(无多个实例)。第二种方法可以标题为Shell Extensions。为了解释这种方法,让我解释一些先决条件(并且如果您已经知道它们,请不要犹豫,跳过它们).Shell扩展名是COM Servers,它们在用户的计算机上注册了一些他们可以处理的特定类型的文件,如的.cs的.csproj(两者都注册到Visual Studio中默认开启).Shell扩展也被称为上下文菜单处理。一个注册的外壳扩展或文本菜单句柄 得到尽快文件扩展名为注册通过它从Windows资源管理器的上下文菜单中右键单击来打开。
    广泛地说,外壳扩展或上下文菜单处理程序是一个注册的COM服务器,它在用户的计算机中以Dynamic Link Library的形式退出,如果注册的文件类型接收到右键单击选择或双击,则调用其功能。
    因此,我想你已经足够为Shell扩展开创一个良好的开端。 Here是一个很好的一步一步的文章,为您提供一个体面的起点中途。

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

0

虽然它相当复杂,但我知道Shell Extension Handler可以解决这个问题。
How to Write Windows Shell Extension with .NET Languages

我写的这一个打开时,用户可以右击一个特定的文件类型Windows窗体应用程序。它也适用于多个文件。

祝你好运!

1

非编程变通,将所有路径同时复制如下(以Windows 7的测试):

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

所有路径按预期被复制!

0

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

FROM

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

TO

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

我尝试过了,在应用程序运行每个选定文件的新实例。我甚至试图将“%2”“%3”等添加到注册表命令中,这也不起作用。

如果真的有必要对所有文件运行一个实例,也许你可以设置你的应用程序与从WindowsFormsApplicationBase派生的类,设置IsSingleInstance性能和覆盖OnStartupNextInstance(没有联系到,因为我的名声不允许超过2个链接)

+0

这是一个很好的例子,用于[单个实例应用程序在c#](http://www.codeproject.com/Articles/12890/Single-Instance-C-Application-for-NET) –

+0

是的,这是要走的路。检测新的应用程序实例并处理这些人之间的通信毫无意义。注意:您将需要* Microsoft.VisualBasic.dll *的引用和'使用Microsoft.VisualBasic.ApplicationServices;' –