在Windows机器上有没有办法以编程方式找出哪个应用程序负责打开具有特定扩展名的文件?

时间:2012-07-20 20:27:24

标签: c# .net vb.net

在Windows机器上,有没有办法以编程方式找出哪个应用程序负责打开具有特定扩展名的文件?假设我想以编程方式找出哪个应用程序负责打开.PDF文件。 (不关心你是否有C#或VB.NET代码)

3 个答案:

答案 0 :(得分:3)

命令行命令ASSOC查找文件关联,命令FTYPE查找分配给它们的操作:

  

<强> C:\&GT; assoc .docx
  .DOCX = Word.Document.12

     

<强> C:\&GT; ftype Word.Document.12
  Word.Document.12 =“C:\ Program Files(x86)\ Microsoft Office \ Office12 \ WINWORD.EXE”/ n / dde ​​

您可以从任何脚本以编程方式调用它们。

从C#开始,您需要执行以下操作:

private string ShellCommand(string command)  
{
  var psi = new ProcessStartInfo("cmd", "/c " + command) {
    RedirectStandardOutput = true,
    CreateNoWindow = true
  };
  var p = Process.Start(psi);
  return p.StandardOutput.ReadToEnd();
}

private string FindDefaultProgram(string extension)
{
   assoc = ShellCommand("assoc " + extension).Split('=')[1];
   program = ShellCommand("ftype " + assoc).Split('=')[1];
   return program;
}

没有测试任何这些,所以拿一粒盐,但这应该让你走上正确的轨道。

答案 1 :(得分:3)

那么,您将从以下位置查看注册表开始:

HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \ Explorer中\ FileExts.pdf \ OpenWithList

a 及以后会有一个或多个键,指向用于打开该类型文件的程序:

using Microsoft.Win32;
var key = Registry.CurrentUser
    .OpenSubKey("Software")
    .OpenSubKey("Microsoft")
    .OpenSubKey("Windows")
    .OpenSubKey("CurrentVersion")
    .OpenSubKey("Explorer")
    .OpenSubKey("FileExts")
    .OpenSubKey(".doc")
    .OpenSubKey("OpenWithList");

var firstProgram = key.GetValue("a"); // E.g. Winword.exe

您可能希望将键的赋值拆分为多个带有空值检查的语句; - )

希望这有帮助!

答案 2 :(得分:2)

我不会给你代码,而是告诉你这些信息的存储位置 - 我相信你可以自己弄清楚其余部分:)

因此,所有数据都存储在HKEY_CLASSES_ROOT中的注册表中。以.pdf为例,有一个键.pdf,其中包含AcroExch.Document作为默认值(至少在我的设置中)。

再次在HKEY_CLASSES_ROOT中,有一个键AcroExch.Document\Shell\Open\Command,其中一个包含"C:\Program Files (x86)\Adobe\Acrobat 8.0\Acrobat\Acrobat.exe" "%1"作为其值。这就是我的计算机上用来打开PDF文件的内容。