C# 在Windows计算机上,有没有一种方法可以通过编程确定哪个应用程序负责打开具有特定扩展名的文件?

C# 在Windows计算机上,有没有一种方法可以通过编程确定哪个应用程序负责打开具有特定扩展名的文件?,c#,.net,vb.net,C#,.net,Vb.net,在Windows计算机上,是否有方法通过编程确定哪个应用程序负责打开具有特定扩展名的文件?假设我想通过编程找出哪个应用程序负责打开.PDF文件。(不管您是否有C#或VB.NET代码)命令行命令ASSOC查找文件关联,命令FTYPE查找分配给它们的操作: C:\>assoc.docx .docx=Word.Document.12 C:\>f键入Word.Document.12 Word.Document.12=“C:\Program Files(x86)\Microsoft Office\Offi

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

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

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

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

我还没有测试过这些信息,所以请谨慎对待,但这会让您走上正确的道路。

我不会给您代码,而是告诉您这些信息存储在哪里–我相信您可以自己解决其余问题:)

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


同样在
HKEY\U CLASSES\U ROOT
中有一个键
AcroExch.Document\Shell\Open\Command
,其中包含
“C:\Program Files(x86)\Adobe\Acrobat 8.0\Acrobat\Acrobat.exe”“%1”
。这就是在我的计算机上用来打开PDF文件的内容。

好的,您可以从以下位置查看注册表开始:

HKEY\U Current\U 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
您可能希望将对key的赋值拆分为几个带有空检查的语句;-)


希望这有帮助

你可以在codeproject.com+1上找到一个非常好的工作类,它提供了一个非常好的答案。但是,作为记录,您不需要一直调用
OpenSubKey
Registry.CurrentUser.OpenSubKey(“软件\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.doc\\OpenWithList”)
可以正常工作。你完全正确!我想知道我当时在想什么;)