Pergunta

I've made an application to do some work with an extension for example ".ext" I added the necessaries entries to the Windows "regedit" for executing the ".ext" when I open it. Now, if I have selected multiple files.ext and I oppen it; then multiples instances of my application arise.

My application receives a String[] args as parameters, so if I open a file.ext then I receive the file path in args[0], the idea is when I open multiple files then receive the first file path as args[0] and the second file path as args[1], and so on, but right now when I open multiple selected files then multiples instances of my applications arise.

The question is: How can I do for execute multiple files.ext and get the paths in my String[] args for all the selected files.ext and not in different instances of my app. Exactly like the VLC player when we select multiples files.mp3 and we open it.

Foi útil?

Solução 2

Finally i found an alternative.
Running only an instance of my app with "Mutex", and importing the shell32.dll i did it.
Somthing like this...

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

Outras dicas

This article describes how to force only a single instance of your application. You could extend the custom windows message WM_SHOWME described there to pass the command line parameter to your single instance.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top