Pregunta

Cómo determinar las aplicaciones asociadas con una extensión en particular (por ejemplo, .JPG) y luego determinar dónde se encuentra el ejecutable de esa aplicación, de modo que se pueda iniciar mediante una llamada para decir System.Diagnostics.Process.Start (.. .).

Ya sé cómo leer y escribir en el registro. Es el diseño del registro lo que hace que sea más difícil determinar de manera estándar qué aplicaciones están asociadas a una extensión, cuáles son los nombres de visualización y dónde se encuentran sus ejecutables.

¿Fue útil?

Solución

Código de muestra:

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

Otros consejos

Como dijo Anders: es una buena idea utilizar la interfaz COM IQueryAssociations. Aquí hay una muestra de pinvoke.net

@aku: No olvides HKEY_CLASSES_ROOT \ SystemFileAssociations \

No estoy seguro de si están expuestos en .NET, pero hay interfaces COM (IQueryAssociations y amigos) que se ocupan de esto, por lo que no tiene que meterse en el registro y esperar que las cosas no cambien en la próxima versión de Windows

También HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \

. EXT \ OpenWithList clave para " Ancho abierto ... " list ('a', 'b', 'c', 'd', etc., valores de cadena para las opciones)

. EXT \ UserChoice clave para " Usar siempre el programa seleccionado para abrir este tipo de archivo " (Valor de cadena 'Progid')

Todos los valores son claves, se utilizan de la misma forma que docName en el ejemplo anterior.

Las asociaciones de tipo de archivo se almacenan en el registro de Windows, por lo que debería poder usar Microsoft.Win32.Registry class para leer qué aplicación está registrada para qué formato de archivo.

Aquí hay dos artículos que podrían ser útiles:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top