如何使用C#中的关联应用程序执行多个“.exe”

时间:2013-11-11 23:47:43

标签: c# windows regedit

我已经创建了一个应用程序来扩展,例如“.ext”我在Windows“regedit”中添加了必需条目,以便在我打开它时执行“.ext”。现在,如果我选择了多个files.ext,我会选择它;然后我的应用程序的倍数实例出现。

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

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

2 个答案:

答案 0 :(得分:0)

This article描述了如何仅强制应用程序的单个实例。您可以扩展此处描述的自定义窗口消息WM_SHOWME,以将命令行参数传递给您的单个实例。

答案 1 :(得分: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;
            }
        }
    }