2008-08-24 4 views
14

So ermitteln Sie die einer bestimmten Erweiterung (z. B. .JPG) zugeordneten Anwendungen und bestimmen dann, wo sich die ausführbare Datei für diese Anwendung befindet, damit sie über einen Aufruf von say gestartet werden kann System.Diagnostics.Process.Start (...).Windows: Anwendungen auflisten und starten, die einer Erweiterung zugeordnet sind

Ich weiß bereits, wie man in die Registrierung liest und schreibt. Es ist das Layout der Registrierung, das es schwieriger macht, auf standardisierte Weise zu bestimmen, welche Anwendungen einer Erweiterung zugeordnet sind, welche Anzeigenamen vorhanden sind und wo sich ihre ausführbaren Dateien befinden.

Antwort

8

Beispielcode:

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

Bessere Verwendung von IQueryAssociations –

4

@aku: Nicht HKEY_CLASSES_ROOT \ SystemFileAssociations vergessen \

Nicht sicher, ob sie in .NET verfügbar gemacht werden, aber es gibt COM-Schnittstellen (IQueryAssociations und Freunde), die damit umgehen, so dass Sie nicht in der Registrierung herumhacken müssen und sich Hoffnungen in der nächsten Windows-Version nicht ändern

8

Wie Anders sagte - Es ist eine gute Idee, die IQueryAssociations COM-Schnittstelle zu verwenden. Hier ist ein sample from pinvoke.net

+2

Der enthaltene Link ist für AssocCreate. Die Verknüpfung zu AssocQuery lautet wie folgt: http: //www.pinvoke.net/default.aspx/shlwapi.AssocQueryString – epotter

1

auch HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Currentversion \ Explorer \ FileExts \

. EXT \ OpenWithList Schlüssel für die "Open width ..." Liste ('a', 'b', 'c', 'd' etc Zeichenfolge Werte für die Auswahl)

. EXT \ UserChoice Schlüssel für die „immer mit dem ausgewählten Programm diese Art von Datei öffnen“ (‚Progid‘ value String-Wert)

Alle Werte Schlüssel sind, verwendet, um die gleiche Art und Weise wie docName im Beispiel oben .