我正在编写一个带有项目列表框的程序,当您右键单击该项目时,将弹出上下文菜单并选择调用"打开",我的问题是如何制作"选择默认程序"窗口显示,如下图所示。
http://postimg.org/image/8ykfrzmjv/
我知道您需要Process.Start()
才能打开它,但我不知道exe名称。
答案 0 :(得分:3)
您可以使用这种方式直接显示“打开方式”对话框:
string FilePath = "C:\\Text.txt";//Your File Path
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "rundll32.exe";
proc.StartInfo.Arguments = "shell32,OpenAs_RunDLL " + FilePath;
proc.Start();
答案 1 :(得分:2)
Windows Shell中的“打开方式...”对话框是explorer.exe的一部分,而不是它自己的程序。您曾经能够使用“openas”动作动词来获取它,但是已经重新定义为Vista,意思是“以管理员身份运行”。
还有一些技巧。其他答案已经演示了OpenAs_RunDLL方法;但应该知道this is an undocumented entry point and does not always work,尤其是在Windows Vista及更高版本上。 API中记录的(因此支持的)入口点是shell32.dll中另一个名为SHOpenWithDialog的函数。这是基于P / Invoke的代码,可以解决这个问题:
public static class OpenWithDialog
{
[DllImport("shell32.dll", EntryPoint = "SHOpenWithDialog", CharSet = CharSet.Unicode)]
private static extern int SHOpenWithDialog(IWin32Window parent, ref OpenAsInfo info);
private struct OpenAsInfo
{
[MarshalAs(UnmanagedType.LPWStr)]
public string FileName;
[MarshalAs(UnmanagedType.LPWStr)]
public string FileClass;
[MarshalAs(UnmanagedType.I4)]
public OpenAsFlags OpenAsFlags;
}
[Flags]
public enum OpenAsFlags
{
None = 0x00,
AllowRegistration = 0x01,
RegisterExt = 0x02,
ExecFile = 0x04,
ForceRegistration = 0x08,
HideRegistration = 0x20,
UrlProtocol = 0x40,
FileIsUri = 0x80,
}
public static int Show(string fileName, IWin32Window parent = null, string fileClass = null, OpenAsFlags openAsFlags = OpenAsFlags.ExecFile)
{
var openAsInfo = new OpenAsInfo
{
FileName = fileName,
FileClass = fileClass,
OpenAsFlags = openAsFlags
};
return SHOpenWithDialog(parent, ref openAsInfo);
}
}
在打开的窗口中,如果从没有附加消息循环的线程运行它,则“浏览”按钮将冻结程序;还建议您传入一个Form实例(或some simple WPF interop magic)作为“父”参数。
以HideRegistration开头的标志是Vista +,最后一个(FileIsUri)是Windows 8+;在以前的版本中它们将被忽略,这可能会导致不良行为。默认情况下,“openAsFlags”参数设置为使用所选程序打开文件,这是RunDLL解决方案不能始终工作的原因之一(此值是OpenAs_RunDLL的第二个参数的一部分,未包括在内runDLL命令行)。返回值应为零或正数;负值是符合WinAPI HRESULT标准的错误。