2

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

4

3 回答 3

3

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

C:\> assoc .docx
.docx=Word.Document.12

C:\> 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;
}

尚未对此进行任何测试,因此请谨慎使用,但这应该可以使您走上正轨。

于 2012-07-20T20:35:07.423 回答
3

好吧,您将首先在以下位置查看注册表:

HKEY_Current_User\Software\Microsoft\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

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

希望这可以帮助!

于 2012-07-20T20:45:59.797 回答
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 文件的内容。

于 2012-07-20T20:36:02.727 回答