Windows: список и запуск приложений, связанных с расширением

Как определить приложения, связанные с конкретным расширением (например, .JPG), а затем определить, где находится исполняемый файл этого приложения, чтобы его можно было запустить с помощью вызова System.Diagnostics.Process.Start (...).

Я уже умею читать и писать в реестр. Именно компоновка реестра усложняет стандартное определение того, какие приложения связаны с расширением, какие существуют отображаемые имена и где находятся их исполняемые файлы.

24.08.2008 10:05:38
5 ОТВЕТОВ
РЕШЕНИЕ

Образец кода:

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);
                }
            }
        }
    }
}
8
24.08.2008 11:01:18
Лучше использовать IQueryAssociations
Simon Gillbee 2.10.2009 02:12:52

Ассоциации типов файлов хранятся в реестре Windows, поэтому вы должны иметь возможность использовать класс Microsoft.Win32.Registry, чтобы прочитать, какое приложение зарегистрировано для какого формата файла.

Вот две статьи, которые могут быть полезны:

0
24.08.2008 10:19:58

@aku: Не забывайте HKEY_CLASSES_ROOT \ SystemFileAssociations \

Не уверен, что они выставлены в .NET, но есть COM-интерфейсы (IQueryAssociations и друзья), которые занимаются этим, так что вам не придется копаться в реестре и надеяться, что материал не изменится в следующей версии Windows

4
28.08.2008 20:49:35

Как сказал Андерс: хорошая идея - использовать COM-интерфейс IQueryAssociations. Вот пример с pinvoke.net

8
27.05.2009 19:42:01
Ссылка включена для AssocCreate. Ссылка на AssocQuery такая: pinvoke.net/default.aspx/shlwapi.AssocQueryString
epotter 13.07.2009 14:41:28

Также HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \

, Ключ EXT \ OpenWithList для списка «Open width ...» (строковые значения «a», «b», «c», «d» и т. Д. Для выбора)

, Ключ EXT \ UserChoice для «Всегда использовать выбранную программу для открытия файла такого типа» (значение строки «Progid»)

Все значения являются ключами и используются так же, как docName в приведенном выше примере.

1
13.11.2010 18:49:06