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有多好.
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设置,这将为你提供与文件类型相关的可能动词的集合.这应该可以更容易地确定如何处理哪个文件.
总而言之,就像我提到托马斯一样,你需要注意并为你的应用程序添加一些复杂性/智能 - 这个答案肯定不是一个全面的解决方案.