Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 в приведенном выше примере.