提前就文件关联的另一个问题道歉。我已经更改了用于创建文件关联的代码,以便它使用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\"");
}
}
}
}