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

本文关键字:文件 应用程序 可执行文件 类型 创建 何创建 列表 关联 | 更新日期: 2023-09-27 18:01:21

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

例如:

当我右键单击"。cs"文件并在上下文菜单中选择"Open With->"时,我的PC上的文件类型"。cs"有许多应用程序关联,例如"Microsoft Visual Studio 2008"&"Microsoft Visual Studio 2010"&"记事本","写字板"。

我如何枚举所有这些值到c#中的列表,显然它必须从注册表中提取,但我非常迷失在所有的"OpenWithList"answers"OpenWithProgids"键..

谢谢

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

在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;
    }