如何删除每用户文件关联

时间:2011-05-14 08:07:58

标签: c# windows registry

提前就文件关联的另一个问题道歉。我已经更改了用于创建文件关联的代码,以便它使用HKEY_CURRRENT_USER \ Software \ Classes。这就解决了需要管理员权限的问题(感谢David Heffernan坚持要求管理员权利。)

我发现继续创建文件关联不会在注册表中复制它,但会更改数据。因此,如果我分配给不同的可执行文件,它将使用当前的可执行文件替换先前但是,我想看看如何完全清除文件关联。我只是搜索条目,如果它在那里删除密钥:

public static void RemoveAssociation(string extension) {
       if (!IsAssociated(extension)) return;
       var currentUser = Registry.CurrentUser;
       var softwareKey = getKey(currentUser, "Software");
       if (softwareKey != null) {
           var softwareClasses = getKey(softwareKey, "Classes");
           if (softwareClasses != null) {
               softwareClasses.DeleteSubKey(extension);
           }
       }
}

IsAssociated只在HKEY_CURRENT_USER \ Software \ Classes

中查找扩展密钥

这会删除密钥,但不会删除注册表中的所有条目。我在HKEY_CLASSES_ROOT以及HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ EXTENSIONS中找到了一个条目。 (我正在运行Win 7,所以我认为这将出现在XP和Vista中?)

Double现在单击扩展名会产生一个对话框,告诉我Windows无法找到相关的可执行文件(可能是因为我已将密钥保留在CLASSES_ROOT中,但通过删除密钥删除了连接)

那么如何干净地删除对扩展名的所有引用?

由于

修改

这是我用来创建关联的代码:

public static void Associate(string extension, string progID, string description, string icon, string application) {
    if (extension == null) return;
    if (String.IsNullOrEmpty(progID)) return;
    if (String.IsNullOrEmpty(application)) return;

    var currentUser = Registry.CurrentUser;
    var softwareKey = getKey(currentUser, "Software");

    if (softwareKey != null) {
        var softwareClasses = getKey(softwareKey, "Classes");

        if (softwareClasses != null) {
            softwareClasses.CreateSubKey(extension).SetValue("", progID);

            using (var key = softwareClasses.CreateSubKey(progID)) {
                    if (description != null)
                        key.SetValue("", description);
                    if (icon != null)
                        key.CreateSubKey("DefaultIcon").SetValue("", toShortPathName(icon));
                    //if (application != null)
                        key.CreateSubKey(@"Shell\Open\Command").SetValue("", toShortPathName(application) + " \"%1\"");
                }
        }
    }

}

0 个答案:

没有答案