How can I show the "Open with" file dialog?

Some reverse-engineering with ProcExp revealed a rundll32.exe command line that worked. Here's a sample program that uses it:

using System;
using System.Diagnostics;
using System.IO;

class Program {
    static void Main(string[] args) {
        ShowOpenWithDialog(@"c:\temp\test.txt");
    }
    public static void ShowOpenWithDialog(string path) {
        var args = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll");
        args += ",OpenAs_RunDLL " + path;
        Process.Start("rundll32.exe", args);
    }
}

Tested on Win7, I cannot guess how well this will work on other versions of Windows.


This ought to do the trick...

var processInfo = new ProcessStartInfo(fileName);
processInfo.Verb = "openas";
Process.Start(processInfo);

Although, Oded makes a great point - not knowing exactly how/where you intend to use such functionality means this might not be the answer for your situation.

Recent comments on this answer go to show I wasn't very detailed in the first place. A problem will arise if you try to openas a file that already has the open verb defined against that type of file. Similarly, if you try to open a file that doesn't have that verb defined there'll be trouble. The issue would be:

Win32Exception: No application is associated with the specified file for this operation

Off the top of my head I suggested to Thomas that in order to use this kind of code in a production application you would need to be thorough and perhaps check the registry, or otherwise find out whether or not a file can and should be opened with any given verb. It could be simpler than that when you consider ProcessStartInfo.Verbs: this will, once the fileName is set, provide you with a collection of possible verbs associated with the file type. This should make it easier to determine what to do with which file.

To wrap up, as I mentioned to Thomas, you will need to take care and add some complexity/intelligence to your application - this answer certainly isn't a catch-all solution.


Using

System.Diagnostics.Process.Start(path);

The file will be openened with the default program, if no default program is defined the open with dialog will be shown.

You can use the the function:

[DllImport("shell32.dll", SetLastError = true)]
extern public static bool 
       ShellExecuteEx(ref ShellExecuteInfo lpExecInfo);

You have an example to use this function on: this link