如何为文件类型创建所有文件关联(友好的应用程序名称和可执行文件)的 C# 列表

Posted

技术标签:

【中文标题】如何为文件类型创建所有文件关联(友好的应用程序名称和可执行文件)的 C# 列表【英文标题】:How to create C# list of ALL file associations(friendly application names & executables) for file type 【发布时间】:2011-09-30 09:06:12 【问题描述】:

我想为特定文件类型创建所有友好应用程序名称及其可执行路径和命令的列表/字典。我用过 AssocQueryString 但它只返回一个实例值。

例如:

当我右键单击“.cs”文件并在上下文菜单中选择“打开方式->”时,我的 PC 上的文件类型“.cs”有很多应用程序关联,例如“Microsoft Visual Studio 2008”和“Microsoft Visual Studio 2010”和“记事本”和“写字板”。

如何在 C# 中将所有这些值枚举到一个列表中,显然它必须从注册表中提取,但我对所有“OpenWithList”和“OpenWithProgids”键都很迷茫..

谢谢

【问题讨论】:

【参考方案1】:

在 HKEY_CLASSES_ROOT 中获取以“.”开头的键 读取它们的默认值 (REG_SZ) 以获取接下来要打开的密钥的名称, 然后在“key_name\shell\open\command”中获取程序位置读取默认值

这将为您提供与该文件类型关联的默认应用程序。

它与 OpenWithProgIds 类似 - 里面的每个值名称都是您应该获取路径的键的键名

附:这是我刚刚写的代码,很乱,不安全,你必须清理调用参数才能获得纯应用程序位置。这只是为了让你开始

        List<string> GetRegAssociatedFiles(string FileType)
    
        List<string> _ret = new List<string>();

        Microsoft.Win32.RegistryKey _rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(FileType);
        string _defaultapp = _rk.GetValue("").ToString();

        Microsoft.Win32.RegistryKey _rkapp = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(_defaultapp + "\\shell\\open\\command");
        _ret.Add(_rkapp.GetValue("").ToString());
        _rkapp.Close();



        string[] _subkeys = _rk.GetSubKeyNames();
        for (int i = 0; i < _subkeys.Length; i++)
        
            if (_subkeys[i] == "OpenWithProgIds")
            
                Microsoft.Win32.RegistryKey _rkh = _rk.OpenSubKey(_subkeys[i]);
                string[] _names = _rkh.GetValueNames();
                for (int j = 0; j < _names.Length; j++)
                
                    if (_names[j] == "")
                        continue;

                    Microsoft.Win32.RegistryKey _rhelp = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(_names[j] + "\\shell\\open\\command");
                    _ret.Add(_rhelp.GetValue("").ToString());
                    _rhelp.Close();
                

            
        

        _rk.Close();

        return _ret;
    

【讨论】:

感谢引导!如何获取友好的应用程序名称? 获取前两个'\"'之间的数据——它是应用程序的绝对路径,然后从它的最后一个索引开始遍历直到你到达一个'\\'获取索引在可执行文件名称的开头,将名称复制到一个新的字符串中。常见的应用程序名称,在大多数情况下,可以通过分析'_names'中的字符串,直到到达第一个'.'来获得。 在上面的示例中,当右键单击“.cs”文件并选择“打开方式->”“Microsoft Visual Studio 2008”和“时,Windows 7 中会显示以下友好的应用程序名称Microsoft Visual Studio 2010”和“记事本”和“写字板”。 您的例程工作正常,但我真正想要的是一个可以执行 AssocQueryString 所做的例程,但返回多个 FriendlyAppName 和 Executable 路径,而不是 %command path% /dde,希望我可以发送一个快速截图 研究这两个页面以获得想要的结果:msdn.microsoft.com/en-us/library/cc144148%28VS.85%29.aspxmsdn.microsoft.com/en-us/library/ee872121%28v=VS.85%29.aspx

以上是关于如何为文件类型创建所有文件关联(友好的应用程序名称和可执行文件)的 C# 列表的主要内容,如果未能解决你的问题,请参考以下文章

如何为枚举使用用户友好的名称? [复制]

如何为通用 HTTP 请求的响应文件指定唯一名称?

如何将应用程序与文件类型(文件扩展名)关联起来?

如何为目录下的所有文件名添加前缀?

如何为 SQL 文件、Visual Studio 数据库项目创建项目模板

如何为文档化的 JavaScript 函数轻松创建 Github 友好的降价?