Pergunta

Como determinar os aplicativos associados a uma extensão específica (por exemplo,.JPG) e, em seguida, determine onde o executável desse aplicativo está localizado para que ele possa ser iniciado por meio de uma chamada para dizer System.Diagnostics.Process.Start(...).

Já sei ler e escrever no registro.É o layout do registro que torna mais difícil determinar de maneira padrão quais aplicativos estão associados a uma extensão, quais são os nomes de exibição e onde seus executáveis ​​estão localizados.

Foi útil?

Solução

Código de amostra:

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);
                }
            }
        }
    }
}

Outras dicas

Como Anders disse - é uma boa ideia usar a interface IQueryAssociations COM.Aqui está um amostra de pinvoke.net

@aku:Não se esqueça de HKEY_CLASSES_ROOT\SystemFileAssociations\

Não tenho certeza se eles estão expostos no .NET, mas existem interfaces COM (IQueryAssociations e amigos) que lidam com isso, para que você não precise mexer no registro e esperar que as coisas não mudem na próxima versão do Windows

Também HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\

.EXTChave \OpenWithList para a lista "Largura aberta..." (valores de string 'a', 'b', 'c', 'd' etc para as escolhas)

.EXTChave \UserChoice para "Sempre usar o programa selecionado para abrir este tipo de arquivo" (valor da string 'Progid')

Todos os valores são chaves, usadas da mesma forma que nomeDoc no exemplo acima.

As associações de tipo de arquivo são armazenadas no registro do Windows, portanto você poderá usar o Classe Microsoft.Win32.Registry para ler qual aplicativo está registrado para qual formato de arquivo.

Aqui estão dois artigos que podem ser úteis:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top