Windows: lister et lancer des applications associées à une extension

Comment déterminer les applications associées à une extension particulière (par exemple .JPG) et déterminer ensuite où se trouve l’exécutable de cette application afin qu’elle puisse être lancée via un appel pour dire System.Diagnostics.Process.Start (…).

Je sais déjà lire et écrire dans le registre. C’est la disposition du registre qui rend plus difficile de déterminer de manière standard quelles applications sont associées à une extension, quels sont leurs noms d’affichage et où se trouvent leurs exécutables.

Exemple de code:

using System; using Microsoft.Win32; namespace GetAssociatedApp { class Program { static void Main(ssortingng[] args) { const ssortingng extPathTemplate = @"HKEY_CLASSES_ROOT\{0}"; const ssortingng cmdPathTemplate = @"HKEY_CLASSES_ROOT\{0}\shell\open\command"; // 1. Find out document type name for .jpeg files const ssortingng ext = ".jpeg"; var extPath = ssortingng.Format(extPathTemplate, ext); var docName = Registry.GetValue(extPath, ssortingng.Empty, ssortingng.Empty) as ssortingng; if (!ssortingng.IsNullOrEmpty(docName)) { // 2. Find out which command is associated with our extension var associatedCmdPath = ssortingng.Format(cmdPathTemplate, docName); var associatedCmd = Registry.GetValue(associatedCmdPath, ssortingng.Empty, ssortingng.Empty) as ssortingng; if (!ssortingng.IsNullOrEmpty(associatedCmd)) { Console.WriteLine("\"{0}\" command is associated with {1} extension", associatedCmd, ext); } } } } } 

Comme Anders l’a dit, c’est une bonne idée d’utiliser l’interface COM d’IQueryAssociations. Voici un extrait de pinvoke.net

@aku: N’oubliez pas HKEY_CLASSES_ROOT \ SystemFileAssociations \

Vous ne savez pas si elles sont exposées dans .NET, mais il existe des interfaces COM (IQueryAssociations et friends) qui vous permettent de ne pas perdre de temps dans le registre et que les choses ne changent pas dans la prochaine version de Windows.

Également HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \

. EXT \ OpenWithList clé pour la liste “Open width …” (valeurs de chaîne ‘a’, ‘b’, ‘c’, ‘d’ etc pour les choix)

. EXT \ UserChoice clé pour “Toujours utiliser le programme sélectionné pour ouvrir ce type de fichier” (valeur de la chaîne “Progid”)

Toutes les valeurs sont des clés, utilisées de la même manière que docName dans l’exemple ci-dessus.

Les associations de types de fichiers sont stockées dans le registre Windows. Vous devriez donc pouvoir utiliser la classe Microsoft.Win32.Registry pour savoir quelle application est enregistrée pour quel format de fichier.

Voici deux articles qui pourraient être utiles:

  • Lecture et écriture du registre dans .NET
  • Registre Windows utilisant C #