2008-08-24 6 views
14

Как определить приложения, связанные с определенным расширением (например, JPG), а затем определить, где находится исполняемый файл для этого приложения, чтобы он мог запускаться с помощью вызова System.Diagnostics.Process.Start (...).Windows: список и запуск приложений, связанных с расширением

Я уже знаю, как читать и писать в реестр. Это макет реестра, который затрудняет стандартное определение того, какие приложения связаны с расширением, какие отображаемые имена и где находятся их исполняемые файлы.

ответ

8

Пример кода:

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

Лучше использовать IQueryAssociations –

0

Ассоциации типов файлов хранятся в реестре Windows, поэтому вы должны иметь возможность использовать Microsoft.Win32.Registry class для чтения, какое приложение зарегистрировано для формата файла.

Вот две статьи, которые могут быть полезны:

4

@aku: Не забудьте HKEY_CLASSES_ROOT \ SystemFileAssociations \

Не уверен, что они отображаются в .NET, но есть COM-интерфейсы (IQueryAssociations и друзья), которые справляются с этим, поэтому вам не нужно гадать в реестре и надеяться, что материал не изменится в следующей версии Windows

8

Как и Андерс сказал - Это хорошая идея использовать интерфейс COM IQueryAssociations. Вот sample from pinvoke.net

+2

Ссылка включена для AssocCreate. Ссылка на AssocQuery такова: http: //www.pinvoke.net/default.aspx/shlwapi.AssocQueryString – epotter

1

Также HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \

. EXT \ OpenWithList ключ для списка «Open width ...» (значения 'a', 'b', 'c', 'd' и т. Д. Для выбора)

. EXT \ ключ UserChoice для «Всегда использовать выбранную программу для открытия этого типа файла» (значение строки значение «Progid»)

Все значения являются ключами, используются так же, как DOCNAME в приведенном выше примере ,