C# Environment.GetCommandLineArgs() 从上下文菜单

发布于 2024-12-28 01:20:18 字数 1075 浏览 0 评论 0原文

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

现在我使用互斥体只允许它运行一次,但我只收到第一个消息框(如预期)。

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

这是没有互斥锁的代码:

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

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

I posted another question earlier about getting the arguments from a context menu App. If you select an item it gives you the string path to that item, but it starts a new instance of the app for every item selected greater than one. With Environment.GetCommandLineArgs() it gives you a string array with the first element is the .exe calling the function and the second element being the string path of the item selected. Again, If I select 2 or more items and right-click >> run app, I get 2 or more instances of the app, each with the first element as the .exe followed by the second element as one of the items selected. (I did this with MessageBox.Show() after joining the two elements and it pops up the message box 3 times, 1 for each of the three items selected).

Now I am using Mutex to only allow it to run once but I only get the first message box (as expected).

How can I get all the items listed in one instance if I select more than one Item?

Here is the code without mutex:

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

And here it is with 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();
        }

No one has been able to help me out with this yet, I hope someone can help me figure this out. Thanks in advance...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南街九尾狐 2025-01-04 01:20:18

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

相反,您可以创建一个服务来侦听来自您的扩展的传入事件(可能是通过 WCF)。然后它可以对传入的文件路径执行您需要的任何操作。

You need an external process to handle this, with your shell extension merely being the "trigger" mechanism. Don't try to keep the shell extension itself as a single instance app.

Instead, you can create a service which listens for incoming events from your extension, perhaps via WCF. Then it can do whatever you need with the incoming file paths.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文