如何在c#中获得与文件扩展名相关的推荐程序

本文关键字:扩展名 程序 文件 | 更新日期: 2023-09-27 18:02:03

我想获得与文件扩展名相关的程序的路径,最好通过Win32 API。

  1. 显示在"打开"菜单中的程序列表项目
  2. 按建议显示的程序列表"Open With…"对话框

乌利希期刊指南:

假设我的机器上安装了office11和office12, .xls的默认程序是office11。如果查看HKEY_CLASSES_ROOT'Excel.Sheet。8'shell'Open'命令有一个路径到office11 excel.exe,但是当我右键单击文件时,我可以在打开菜单项中选择office12。那么这个关联存储在哪里呢?

我正在使用c#。

谢谢。

如何在c#中获得与文件扩展名相关的推荐程序

我写了一个小程序:

public IEnumerable<string> RecommendedPrograms(string ext)
{
  List<string> progs = new List<string>();
  string baseKey = @"Software'Microsoft'Windows'CurrentVersion'Explorer'FileExts'." + ext;
  using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"'OpenWithList"))
  {
    if (rk != null)
    {
      string mruList = (string)rk.GetValue("MRUList");
      if (mruList != null)
      {
        foreach (char c in mruList.ToString())
          progs.Add(rk.GetValue(c.ToString()).ToString());
      }
    }
  }
  using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"'OpenWithProgids"))
  {
    if (rk != null)
    {
      foreach (string item in rk.GetValueNames())
        progs.Add(item);
    }
    //TO DO: Convert ProgID to ProgramName, etc.
  }
  return progs;
  }

被这样调用:

foreach (string prog in RecommendedPrograms("vb"))
{
  MessageBox.Show(prog);
}

曾经想通过编程方式将系统上的文件类型与应用程序关联起来,但不喜欢自己挖掘注册表的想法吗?如果是这样,那么本文和代码非常适合您。

系统文件关联

我用LarsTech改进了方法。现在它返回程序的路径。

public List<string> RecommendedPrograms(string ext)
{
  //Search programs names:
  List<string> names = new List<string>();
  string baseKey = @"Software'Microsoft'Windows'CurrentVersion'Explorer'FileExts'." + ext;
  string s;
  using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"'OpenWithList"))
  {
    if (rk != null)
    {
      string mruList = (string)rk.GetValue("MRUList");
      if (mruList != null)
      {
        foreach (char c in mruList)
        {
          s = rk.GetValue(c.ToString()).ToString();
          if (s.ToLower().Contains(".exe"))
            names.Add(s);
        }
      }
    }
  }
  if (names.Count == 0)
    return names;
  //Search paths:
  List<string> paths = new List<string>();
  baseKey = @"Software'Classes'Applications'{0}'shell'open'command";
  foreach (string name in names)
    using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(String.Format(baseKey, name)))
    {
      if (rk != null)
      {
        s = rk.GetValue("").ToString();
        s = s.Substring(1, s.IndexOf("'"", 2) - 1); //remove quotes
        paths.Add(s);
      }
    }
  if (paths.Count > 0)
    return paths;
  //Search pathes for Windows XP:
  foreach (string name in names)
    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(String.Format(baseKey, name)))
    {
      if (rk != null)
      {
        s = rk.GetValue("").ToString();
        s = s.Substring(1, s.IndexOf("'"", 2) - 1); //remove quotes
        paths.Add(s);
      }
    }
  return paths;
}