【问题标题】:How can I show the "Open with" file dialog?如何显示“打开方式”文件对话框?
【发布时间】:2011-01-18 16:30:11
【问题描述】:

有什么简单的方法可以打开“打开方式”文件对话框吗?

【问题讨论】:

标签: c#


【解决方案1】:

使用 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 上的效果如何。

【讨论】:

  • 谢谢@Hans!我在灌木丛中徘徊了一段时间,这就是我所需要的。我没有使用 shell32.dll 的完整路径。
  • 请注意,OpenAs_RunDLL 是无证的,does not always work.
  • 我会将 Environment.GetFolderPath(Environment.SpecialFolder.System) 替换为 Environment.SystemDirectory。它更短并且具有相同的结果。
  • 老问题(但仍然相关!),但我相信 Harry Johnston 在他的链接评论中使用SHOpenWithDialog 的答案是更好的答案。话虽如此,我在 Win10 1909 上尝试了 Han 的答案,它适用于我测试过的少数类型。
【解决方案2】:

这应该可以解决问题...

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

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

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

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

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

最后,正如我向 Thomas 提到的那样,您需要注意并为您的应用程序添加一些复杂性/智能 - 这个答案当然不是一个包罗万象的解决方案。

【讨论】:

  • 不起作用... Win32Exception, "没有应用程序与此操作的指定文件关联"
  • @ThomasLevesque 只有在没有定义“默认程序”的情况下才会起作用;也就是说,如果该文件有一个Open with... 上下文菜单,那么这将失败。如果它是带有 Open 选项的未知文件类型,那么这将起作用。反之亦然:对已知文件类型使用open 动词将启动默认程序,但如果未知,则会引发同样的异常。因此,在适当的应用程序中,您需要彻底了解这一点;也许在已知的文件类型存储库(注册表)中进行查找,并根据系统给出的事实决定如何打开。
  • @ThomasLevesque 实际上,您甚至不需要这么长:ProcessStartInfo.Verbs 将在设置 fileName 时填充文件的可能动词,这意味着您可以检查是否定义了 open 动词,如果未定义则使用 openas。这并不能涵盖我打赌的所有情况,因此请随意添加您自己的聪明才智。
  • 感谢@ThomasLevesque,这对我非常有用。使用ErrorDialog,您可以在文件系统中打开未关联的文件,就像您从 Windows 资源管理器中的文件夹打开它一样,显示用于浏览应用程序的对话框。如果没有这个,我的应用在打开未关联的文件时会崩溃。
  • -1 我的理解是,这仅在文件没有默认应用程序时才有效,这与仅在文件名本身上调用 Process.Start 没有什么不同。我错过了什么吗?
【解决方案3】:

使用

System.Diagnostics.Process.Start(path);

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

您可以使用该功能:

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

你有一个使用这个函数的例子:this link

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2015-10-22
      • 2021-02-01
      • 1970-01-01
      相关资源
      最近更新 更多