2011-07-13 6 views
8

Deseo obtener la ruta a los programas asociados con la extensión de archivo, preferentemente a través de la API de Win32.Cómo obtener programas recomendados asociados con la extensión de archivo en C#

  1. lista de programas que aparece en "Abrir con" menú elemento
  2. Lista de programas que aparece como se recomienda en "Abrir con ..." de diálogo.

UPD:

Supongamos que tengo office11 y office12 instalado en mi máquina, programa predeterminado para .xls es Office 11. Si vistazo a HKEY_CLASSES_ROOT \ Excel.Sheet.8 \ shell \ open \ command existe es una ruta de acceso a office11 excel.exe, pero cuando hago clic derecho en el archivo puedo elegir office12 en Abrir con el elemento de menú. Entonces, ¿dónde está almacenada esta asociación?

Estoy usando C#.

Gracias.

+0

está en el registro, así que tal vez sólo debe tratar de leer el asociado programas del registro – Fender

+1

Mira aquí. Debe obtener la información del registro http://stackoverflow.com/questions/212906/script-to-associate-an-extension-to-a-program#212921 –

+1

posible duplicado de [Windows: enumerar y ejecutar aplicaciones asociadas a un extensión] (http://stackoverflow.com/questions/24954/windows-list-and-launch-applications-associated-with-an-extension) –

Respuesta

11

escribí una pequeña rutina:

public IEnumerable<string> RecommendedPrograms(string ext) 
{ 
    List<string> progs = new List<string>(); 

    string baseKey = @"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." + ext; 

    using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"\OpenWithList")) 
    { 
    if (rk != null) 
    { 
     string mruList = (string)rk.GetValue("MRUList"); 
     if (mruList != null) 
     { 
     foreach (char c in mruList.ToString()) 
      progs.Add(rk.GetValue(c.ToString()).ToString()); 
     } 
    } 
    } 

    using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"\OpenWithProgids")) 
    { 
    if (rk != null) 
    { 
     foreach (string item in rk.GetValueNames()) 
     progs.Add(item); 
    } 
    //TO DO: Convert ProgID to ProgramName, etc. 
    } 

    return progs; 
    } 

la que es llamada así:

foreach (string prog in RecommendedPrograms("vb")) 
{ 
    MessageBox.Show(prog); 
} 
+1

gracias por tomarse el tiempo para escribir esta rutina, pero parece que es una forma muy enredada de obtener ese tipo de cosas del registro ... por ejemplo acerca de la extensión xls: la rutina devuelve no solo programas recomendados, sino todas las aplicaciones que alguna vez abrieron este tipo de archivo (incluso aplicaciones escritas por mí), también devuelve solo un programa Excel.Sheet.8, i Intenté registrarlo, pero encontré que solo el camino a la oficina 11 era excelente ... De todos modos, gracias de nuevo por dar una buena respuesta. es más que nada – Alexander

+0

No está mal, pero no te da los nombres de los programas: / – StinkyCat

3

¿Alguna vez quiso asociar programáticamente un tipo de archivo en el sistema con su aplicación, pero no le gustó la idea de buscar en el registro usted mismo? Si es así, este artículo y código son adecuados para usted.

System File Association

+0

gracias por la ayuda, pero necesito obtener asociaciones, no configurar) miro en el código fuente pero todavía no puedo encontrar la forma ( – Alexander

Cuestiones relacionadas