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