How to get recommended programs associated with file extension in C# How to get recommended programs associated with file extension in C# windows windows

How to get recommended programs associated with file extension in C#


I wrote a small routine:

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

which gets called like so:

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


Ever wanted to programmatically associate a file type on the system with your application, but didn't like the idea of digging through the registry yourself? If so, then this article and code are right for you.

System File Association


I improved method by LarsTech. Now it returns paths to programs.

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