【问题标题】:C# Environment.GetCommandLineArgs() from context menu上下文菜单中的 C# Environment.GetCommandLineArgs()
【发布时间】:2012-01-20 01:02:02
【问题描述】:

我之前发布了另一个关于从上下文菜单应用程序中获取参数的问题。如果您选择一个项目,它会为您提供该项目的字符串路径,但它会为每个选择的大于一个的项目启动一个新的应用程序实例。使用 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);
    }

这里是互斥锁:

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();
        }

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

【问题讨论】:

  • 您使用了很多代词,难以理解您在做什么。例如,您说“它确实 X”,但没有明确说明“它”是什么。
  • 该应用程序是 Windows 上下文菜单应用程序...在桌面上选择一个文件并右键单击...在该上下文菜单中是我的应用程序。选择应用程序,它将获取所选文件的文件路径并将其添加到集合中(如果选择了多个文件,则应将多个文件路径添加到集合中)。这有帮助吗?
  • 那么,你的意思是你的程序是一个shell扩展?

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


【解决方案1】:

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

相反,您可以创建一个服务来侦听来自您的扩展程序的传入事件,可能通过 WCF。然后它可以对传入的文件路径做任何你需要的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多