来自上下文菜单的C#Environment.GetCommandLineArgs()

时间:2012-01-19 16:38:51

标签: c# collections contextmenu mutex command-line-arguments

我之前发布了另一个关于从上下文菜单App获取参数的问题。如果您选择一个项目,它会为您提供该项目的字符串路径,但它会为所选项目大于一的项目启动应用程序的新实例。使用Environment.GetCommandLineArgs(),它为您提供了一个字符串数组,第一个元素是.exe调用函数,第二个元素是所选项的字符串路径。同样,如果我选择2个或更多项目并右键单击>>运行应用程序,我得到2个或更多的应用程序实例,每个实例的第一个元素为.exe,后跟第二个元素作为所选项目之一。 (我在加入两个元素后使用MessageBox.Show()完成此操作,它会弹出消息框3次,为所选的三个项目中的每一个弹出1。)

现在我使用Mutex只允许它运行一次,但我只得到第一个消息框(正如预期的那样)。

如果我选择多个项目,如何获得一个实例中列出的所有项目?

以下是没有互斥的代码:

static void Main()
    {
        String[] args = Environment.GetCommandLineArgs();
        var message = string.Join(", ", args);
        MessageBox.Show(message);
    }

这就是Mutex:

static void Main()
    {
        Mutex startOnlyOne = new Mutex(false, "WinSyncSingalInstanceMutx");
        if (startOnlyOne.WaitOne(0, false))
        {
            String[] args = Environment.GetCommandLineArgs();
            var message = string.Join(", ", args);
            MessageBox.Show(message);
            startOnlyOne.Close();
        }

还没有人能够帮助我解决这个问题,我希望有人可以帮助我解决这个问题。提前谢谢......

1 个答案:

答案 0 :(得分:1)

您需要一个外部进程来处理这个问题,而您的shell扩展只是“触发器”机制。不要试图将shell扩展本身保持为单实例应用程序。

相反,您可以创建一个服务,该服务可以通过WCF侦听来自您的扩展的传入事件。然后它可以使用传入的文件路径执行任何操作。