【问题标题】:Open file with associated application使用关联的应用程序打开文件
【发布时间】:2012-04-27 18:50:03
【问题描述】:

我想寻求有关从 c# 应用程序和关联应用程序打开文件的帮助。 我试过这个:

      ProcessStartInfo pi = new ProcessStartInfo(file);
      pi.Arguments = Path.GetFileName(file);
      pi.UseShellExecute = true;
      pi.WorkingDirectory = Path.GetDirectoryName(file);
      pi.FileName = file;
      pi.Verb = "OPEN";
      Process.Start(pi);

或者这个:

      Process.Start(file);

其中两个示例中的字符串file 表示尝试打开的文件的完整路径。现在,除了 (jpg) 带有 ACDSee 应用程序 的图像之外,一切都运行良好。 Irfanview 协会运作良好,MS 办公文件也很好。尝试打开与 acdsee 关联的 jpg 图像后,它只会在通知区域中运行 acdsee,而不会打开文件。

我发现,在 *.jpg 图像的注册表 CLASSES_ROOT 中,有一个 ACDSee.JPG 值作为关联的应用程序,并且在此键下有在 shell->Open ->命令路径:

"C:\Program Files\ACD Systems\ACDSee\ACDSee.exe" /dde

我觉得这个奇怪的/dde 是我无法打开文件的原因。我意识到在同一个 reg 键 shell->Open 中有一些 DDEExec 键条目,其值为 [open("%1")]

对于 Irfan 视图或其他检查的应用程序,没有 ddeexec,只有普通命令,如

"C:\Program Files (x86)\IrfanView\i_view32.exe" "%1"

可以在将 %1 换成文件名 后从命令行运行,但我无法从命令行中的 acdsee 条目运行该命令 :(

所以我的问题是,我如何设置ProcessStartInfo 对象以确保它将运行所有文件,就像在资源管理器中通过双击、标准和这个@987654330 一样@ 那些?还有其他类似DDEExec 的东西我应该注意吗? 感谢和抱歉我的英文

更新:因为这个问题仍然得到赞成,我想澄清接受的答案有效。我只对旧版本的 ACDSee 有问题,而不是 Process.Start 命令或 jpg 扩展名。

【问题讨论】:

    标签: c# process file-association


    【解决方案1】:

    随便写

    System.Diagnostics.Process.Start(@"file path");
    

    例子

    System.Diagnostics.Process.Start(@"C:\foo.jpg");
    System.Diagnostics.Process.Start(@"C:\foo.doc");
    System.Diagnostics.Process.Start(@"C:\foo.dxf");
    ...
    

    shell 将运行相关程序从注册表中读取它,就像通常的双击一样。

    【讨论】:

    • 他好像已经用Process.Start(file);试过了。
    • “所以我的问题是,我如何设置 ProcessStartInfo 对象以确保它通过双击运行资源管理器中的所有文件”:答案是。正如我所见,他使用命令行参数,无论如何......但不是直接调用。
    • @Tigran Mario 是对的,正如我所写的那样,我将您的建议作为第二个示例进行了尝试...我想以显然这不是正确的解决方案的方式问我的问题,因为 jpg 不是打开了!
    • @Zavael:在我的机器上它会打开 Windows 默认编辑器,所以我认为在你的系统上它应该只打开已安装并与该格式相关联的最新软件。
    • @Tigran 正如我所写,如果我有 Irfanview,没关系,如果我有 word 文档,没关系,即使是 windows 查看器也可以正常工作,但它们的命令在一个 reg 值中...... acdsee有一些 /dde 参数和一个 DDEExec 注册表项,我认为这是为了一起构建命令,因此它不起作用......而且它不仅在我的机器上......尝试安装 acdsee 4 然后运行代码跨度>
    【解决方案2】:

    .Net Core(从 v2.2 开始)它应该是:

    new Process
    {
        StartInfo = new ProcessStartInfo(@"file path")
        {
            UseShellExecute = true
        }
    }.Start();
    

    相关github issue可以在here找到

    【讨论】:

    • 适用于 .NET 5。
    【解决方案3】:

    这是一个旧线程,但以防万一有人像我一样遇到它。 pi.FileName 需要设置为要用于打开文件的可执行文件的文件名(可能还有 file 的完整路径)。下面的代码适用于我用 VLC 打开视频文件。

    var path = files[currentIndex].fileName;
    var pi = new ProcessStartInfo(path)
    {
        Arguments = Path.GetFileName(path),
        UseShellExecute = true,
        WorkingDirectory = Path.GetDirectoryName(path),
        FileName = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe",
        Verb = "OPEN"
    };
    Process.Start(pi)
    

    Tigran 的答案有效,但会使用 Windows 的默认应用程序打开您的文件,因此如果您想使用非默认应用程序打开文件,使用 ProcessStartInfo 可能会很有用。

    【讨论】:

    • (: a comment on an old response to an old thread :) Tigran 的回答为每个文件的扩展名运行最近关联的程序。 Tree 的回答强制它使用 vlc.exe。 Zavael 的问题是关于他遇到 ACDSee.exe 的问题以及它如何设置其扩展关联。我认为需要就此联系 ACDSee 的作者。
    • 这是 acdsee 的旧版本,我没有用新版本验证它,所以我没有联系他们,只是为了了解信息:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多