如何显示“打开方式”文件对话框?

有没有简单的方法来打开“打开方式”文件对话框?

使用ProcExp进行的一些逆向工程显示了一个有效的rundll32.exe命令行。 这是一个使用它的示例程序:

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

在Win7上测试过,我猜不出这对其他版本的Windows有多好。

这应该是诀窍……

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

虽然,Oded提出了一个很好的观点 – 不知道您打算如何/在何处使用此类function意味着这可能不适合您的情况。

最近对这个答案的评论表明我起初并不是很详细。 如果您尝试open已经针对该类型的文件定义了open动词的文件,则会出现问题。 同样,如果您尝试open没有定义该动词的文件,则会出现问题。 问题是:

Win32Exception:没有应用程序与此操作的指定文件关联

在我的头脑中,我向Thomas建议,为了在生产应用程序中使用这种代码,您需要彻底检查注册表,或者查看文件是否可以并且应该打开任何给定的动词。 它可能比您考虑ProcessStartInfo.Verbs时更简单:一旦设置了fileName ,这将为您提供与文件类型相关联的可能动词的集合。 这应该可以更容易地确定如何处理哪个文件。

总而言之,就像我提到托马斯一样,你需要注意并为你的应用程序添加一些复杂性/智能 – 这个答案肯定不是一个全面的解决方案。

运用

 System.Diagnostics.Process.Start(path); 

该文件将使用默认程序打开,如果未定义默认程序,则将显示打开对话框。

你可以使用这个function:

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

您有一个使用此function的示例: 此链接

All In One Code Framework中有大量的shell示例 。 也许你可以看看它们,看看一个例子是否有你想要的function。