Окна:Список и запуск приложений, связанных с расширением
Вопрос
Как определить приложения, связанные с конкретным расширением (например..JPG), а затем определить, где находится исполняемый файл этого приложения, чтобы его можно было запустить с помощью вызова System.Diagnostics.Process.Start(...).
Я уже умею читать и писать в реестр.Именно структура реестра затрудняет определение стандартным способом, какие приложения связаны с расширением, какие там отображаемые имена и где находятся их исполняемые файлы.
Решение
Образец кода:
using System;
using Microsoft.Win32;
namespace GetAssociatedApp
{
class Program
{
static void Main(string[] args)
{
const string extPathTemplate = @"HKEY_CLASSES_ROOT\{0}";
const string cmdPathTemplate = @"HKEY_CLASSES_ROOT\{0}\shell\open\command";
// 1. Find out document type name for .jpeg files
const string ext = ".jpeg";
var extPath = string.Format(extPathTemplate, ext);
var docName = Registry.GetValue(extPath, string.Empty, string.Empty) as string;
if (!string.IsNullOrEmpty(docName))
{
// 2. Find out which command is associated with our extension
var associatedCmdPath = string.Format(cmdPathTemplate, docName);
var associatedCmd =
Registry.GetValue(associatedCmdPath, string.Empty, string.Empty) as string;
if (!string.IsNullOrEmpty(associatedCmd))
{
Console.WriteLine("\"{0}\" command is associated with {1} extension", associatedCmd, ext);
}
}
}
}
}
Другие советы
Как сказал Андерс, рекомендуется использовать COM-интерфейс IQueryAssociations.Вот образец с сайта pinvoke.net
@аку:Не забудьте HKEY_CLASSES_ROOT\SystemFileAssociations\.
Не уверен, что они представлены в .NET, но есть COM-интерфейсы (IQueryAssociations и подобные), которые справляются с этим, поэтому вам не придется копаться в реестре и надеяться, что в следующей версии Windows ничего не изменится.
Также HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\
.ЭКШНКлюч \OpenWithList для списка «Ширина открытия...» (строковые значения «a», «b», «c», «d» и т. д. для выбора)
.ЭКШНКлавиша \UserChoice для параметра «Всегда использовать выбранную программу для открытия файлов такого типа» (значение строкового значения «Progid»)
Все значения являются ключами и используются так же, как и имя_документа в примере выше.
Ассоциации типов файлов хранятся в реестре Windows, поэтому вы сможете использовать Класс Microsoft.Win32.Registry чтобы прочитать, какое приложение зарегистрировано для какого формата файла.
Вот две статьи, которые могут быть полезны: