有没有简单的方法可以打开“打开方式”文件对话框?
答案 0 :(得分: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);
}
}
在Win7上测试过,我无法猜测这对其他版本的Windows有多好。
答案 1 :(得分:10)
应该这样做......
var processInfo = new ProcessStartInfo(fileName);
processInfo.Verb = "openas";
Process.Start(processInfo);
虽然,Oded提出了一个很好的观点 - 不知道您打算如何/在何处使用此类功能意味着这可能不适合您的情况。
最近对这个答案的评论表明我起初并不是很详细。如果您尝试openas
已经针对该类型的文件定义了open
谓词的文件,则会出现问题。同样,如果你尝试open
一个没有定义动词的文件,那就会有麻烦。问题是:
Win32Exception:没有应用程序与此操作的指定文件相关联
在我的脑海中,我向Thomas建议,为了在生产应用程序中使用这种代码,您需要彻底检查注册表,或者查看文件是否能够和应该用任何给定的动词打开。当你考虑ProcessStartInfo.Verbs
时,它可能比那更简单:一旦fileName
被设置,这将为你提供与文件类型相关的可能动词的集合。这样可以更容易地确定如何处理哪个文件。
总结一下,正如我向托马斯提到的那样,你需要注意并为你的应用程序添加一些复杂性/智能 - 这个答案肯定不是一个全能的解决方案。
答案 2 :(得分:2)
使用
System.Diagnostics.Process.Start(path);
该文件将使用默认程序打开,如果未定义默认程序,将显示打开对话框。
您可以使用该功能:
[DllImport("shell32.dll", SetLastError = true)]
extern public static bool
ShellExecuteEx(ref ShellExecuteInfo lpExecInfo);
您可以在this link
上使用此功能答案 3 :(得分:-3)
shell examples中有All In One Code Framework吨。也许你可以看看它们,看看一个例子是否具有你想要的功能。