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

StackOverflow https://stackoverflow.com/questions/24954

  •  09-06-2019
  •  | 
  •  

Вопрос

Как определить приложения, связанные с конкретным расширением (например..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 чтобы прочитать, какое приложение зарегистрировано для какого формата файла.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top