Windows: список и запуск приложений, связанных с расширением
Как определить приложения, связанные с определенным расширением (например, JPG), а затем определить, где находится исполняемый файл для этого приложения, чтобы его можно было запустить с помощью вызова, чтобы сказать System.Diagnostics.Process.Start(...).
Я уже знаю, как читать и записывать в реестр. Это макет реестра, который затрудняет стандартное определение того, какие приложения связаны с расширением, какие отображаемые имена и где находятся их исполняемые файлы.
Ответы
Ответ 1
Пример кода:
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);
}
}
}
}
}
Ответ 2
Как сказал Андерс. Это хорошая идея использовать интерфейс COM IQueryAssociations.
Здесь образец из pinvoke.net
Ответ 3
@aku: Не забудьте HKEY_CLASSES_ROOT\SystemFileAssociations\
Не уверен, что они отображаются в .NET, но есть COM-интерфейсы (IQueryAssociations и друзья), которые справляются с этим, поэтому вам не нужно гадать в реестре и надеюсь, что материал не изменится в следующей версии Windows
Ответ 4
Также HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\
.EXT\OpenWithList для списка "Open width..." (значения 'a', 'b', 'c', 'd' и т.д. для выбора)
.EXT\UserChoice для "Всегда использовать выбранную программу для открытия такого типа файла" (значение строки "Progid" )
Все значения являются ключами, которые использовались так же, как docName в приведенном выше примере.
Ответ 5
Связи типов файлов хранятся в реестре Windows, поэтому вы можете использовать класс Microsoft.Win32.Registry для чтения какое приложение зарегистрировано для формата файла.
Вот две статьи, которые могут быть полезны: