9
votes

Comment obtenir des programmes recommandés associés à l'extension de fichier en C #

Je veux obtenir un chemin vers les programmes associés à une extension de fichier, de préférence via Win32 API.

  1. Liste de programmes qui apparaît dans le menu "Ouvrir avec" Item
  2. Liste de programmes qui apparaît comme recommandé dans "Ouvrir avec ..." Dialog.

    UPD:

    Supposons que j'ai Office11 et Office12 installé sur ma machine, le programme par défaut pour .xls est Office 11. Si vous consultez HKEY_CLASSES_ROOT \ Excel.sheet.8 \ shell \ Open \ Commande Il y a un chemin d'Office11 Excel.exe, Mais quand j'ai le droit de cliquer avec le fichier, je peux choisir Office12 à Ouvrir avec l'élément de menu. Alors, où est-ce que cette association est stockée?

    J'utilise c #.

    Merci.


3 Réponses :



14
votes

J'ai écrit une petite routine: xxx

qui est appelé comme: xxx


2 commentaires

Merci d'avoir pris le temps d'écrire cette routine, mais il semble que c'est une façon très enchevêtrée d'obtenir ce genre de choses de registre ... Par exemple, l'extension XLS: Retours de routine non seulement des programmes recommandés, mais toutes les apllications qui ont déjà ouvert ce type de Fichier (même des applications écrites par moi), il ne renvoie également qu'un seul progid excessif.sheet.8, j'ai essayé de le registre de Serach, mais n'a trouvé que de la voie à Office 11 Excel ... De toute façon, merci encore de fournir une bonne réponse. C'est plus que rien


Pas mal, mais ne vous obtient pas les noms de programme: /



0
votes

J'ai une méthode améliorée de Larstech. Maintenant, il renvoie des chemins vers des programmes.

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;
}


0 commentaires