Как получить рекомендуемые программы, связанные с расширением файла в C#
Я хочу получить путь к программам, связанным с расширением файла, желательно через Win32 API.
- Список программ, который появляется в пункте меню "Открыть с помощью"
- Список программ, отображаемых в соответствии с рекомендациями в диалоговом окне "Открыть с помощью...".
UPD:
Предположим, что на моем компьютере установлены office11 и office12, программой по умолчанию для.xls является office 11. Если посмотреть на команду HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\, то есть путь к office11 excel.exe, но когда я щелкнув правой кнопкой мыши по файлу, я могу выбрать office12 в пункте меню "Открыть с помощью". Так где же хранится эта ассоциация?
Я использую C#.
Благодарю.
3 ответа
Я написал небольшую рутину:
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;
}