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

los*_*eko 15 c#

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

Han*_*ant 22

使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,“OpenAs_RunDLL”未记录并且[并不总是有效。](http://stackoverflow.com/questions/23566667/rundll32-shell32-dl​​l) (2认同)

Gra*_*mas 11

这应该是诀窍......

var processInfo = new ProcessStartInfo(fileName);
processInfo.Verb = "openas";
Process.Start(processInfo);
Run Code Online (Sandbox Code Playgroud)

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

最近对这个答案的评论表明我首先不是很详细.如果您尝试openas的文件已经open针对该类型的文件定义了动词,则会出现问题.同样,如果你尝试open一个没有定义动词的文件,那就会有麻烦.问题是:

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

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

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