14

如何确定与特定扩展名(例如 .JPG)关联的应用程序,然后确定该应用程序的可执行文件所在的位置,以便可以通过调用 System.Diagnostics.Process.Start(...) 来启动它。

我已经知道如何读写注册表。注册表的布局使得以标准方式确定与扩展关联的应用程序、显示名称以及可执行文件的位置变得更加困难。

4

5 回答 5

9

就像 Anders 所说的那样——使用 IQueryAssociations COM 接口是个好主意。这是来自 pinvoke.net 的示例

于 2009-05-27T19:42:01.633 回答
7

示例代码:

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);
                }
            }
        }
    }
}
于 2008-08-24T11:01:18.470 回答
5

@aku:不要忘记 HKEY_CLASSES_ROOT\SystemFileAssociations\

不确定它们是否在 .NET 中公开,但有处理此问题的 COM 接口(IQueryAssociations 和朋友),因此您不必在注册表中乱搞并希望在下一个 Windows 版本中不会改变

于 2008-08-28T20:49:35.247 回答
1

还有 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\

. “打开宽度...”列表的EXT \OpenWithList 键(选择的“a”、“b”、“c”、“d”等字符串值)

. EXT \UserChoice 键用于“始终使用所选程序打开此类文件”('Progid' 字符串值)

所有值都是键,使用方式与上例中的docName相同。

于 2010-11-13T18:49:06.520 回答
0

文件类型关联存储在 Windows 注册表中,因此您应该能够使用Microsoft.Win32.Registry 类来读取为哪种文件格式注册了哪个应用程序。

这里有两篇文章可能会有所帮助:

于 2008-08-24T10:19:58.710 回答