2

我已经制作了一个应用程序来使用扩展名进行一些工作,例如“.ext”我将必要的条目添加到 Windows“regedit”中,以便在打开它时执行“.ext”。现在,如果我选择了多个 files.ext 并打开它;然后出现我的应用程序的多个实例。

我的应用程序接收一个String[] argsas 参数,所以如果我打开一个 file.ext 然后我收到文件路径 in args[0],这个想法是当我打开多个文件然后接收第一个文件路径args[0]和第二个文件路径args[1],依此类推,但是现在,当我打开多个选定文件时,会出现多个应用程序实例。

问题是:如何执行多个 files.ext 并在我String[] args的所有选定 files.ext 中获取路径,而不是在我的应用程序的不同实例中。当我们选择多个 files.mp3 并打开它时,就像 VLC 播放器一样。

4

2 回答 2

0

最后我找到了一个替代方案。
仅使用“Mutex”运行我的应用程序的一个实例,并导入 shell32.dll 我做到了。
像这样的东西...

 private static bool isAlreadyInstantiated()
    {
        new Mutex(true, "my_app", out mutex_bool);
        return !mutex_bool;
    }


    private static void getSelectedFiles()
    {
        selected_files = new List<SelectedFile>();

        String filename;
        // Required ref: SHDocVw (Microsoft Internet Controls COM Object)
        ShellWindows shell = new SHDocVw.ShellWindows();

        foreach (SHDocVw.InternetExplorer window in shell)
        {

            filename = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
            if (filename.ToLowerInvariant() == "explorer")
            {
                Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();

                if (selected_files.Count == 0)
                {
                    foreach (Shell32.FolderItem item in items)
                    {
                        if (active_folder == Path.GetDirectoryName(item.Path))
                            selected_files.Add(new SelectedFile("\"" + item.Path + "\"", item.Name, Math.Round(((double)item.Size / (double)1024), 2)));
                        else
                            break;
                    }
                }
                else
                    return;
            }
        }
    }
于 2013-11-21T05:35:35.447 回答
0

本文介绍如何仅强制应用程序的单个实例。您可以扩展那里描述的自定义窗口消息WM_SHOWME,以将命令行参数传递给您的单个实例。

于 2013-11-11T23:54:30.680 回答