Windows: aplicaciones de lista y lanzamiento asociadas con una extensión

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

Ya sé leer y escribir en el registro. Es el diseño del registro lo que hace más difícil determinar de manera estándar qué aplicaciones están asociadas con una extensión, qué nombres se muestran y dónde se encuentran sus ejecutables.

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

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

@aku: no olvide 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, así que no tiene que ensuciar 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 \

. Tecla EXT \ OpenWithList para la lista “Ancho abierto …” (valores de cadena ‘a’, ‘b’, ‘c’, ‘d’ etc. para las opciones)

. Tecla EXT \ UserChoice para “Usar siempre el progtwig seleccionado para abrir este tipo de archivo” (valor del valor de la cadena ‘Progid’)

Todos los valores son claves, utilizados de la misma manera 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 utilizar la clase Microsoft.Win32.Registry para leer qué aplicación está registrada para qué formato de archivo.

Aquí hay dos artículos que pueden ser útiles:

  • Leer y escribir el registro en .NET
  • Registro de Windows usando C #