如何在 C# 中删除注册表值

Posted

技术标签:

【中文标题】如何在 C# 中删除注册表值【英文标题】:How to delete a registry value in C# 【发布时间】:2010-10-06 13:54:38 【问题描述】:

我可以使用 Microsoft.Win32.Registry 类获取/设置注册表值。例如,

Microsoft.Win32.Registry.SetValue(
    @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run",
    "MyApp", 
    Application.ExecutablePath);

但我无法删除任何值。如何删除注册表值?

【问题讨论】:

【参考方案1】:
 string explorerKeyPath = @"Software\TestKey";
 using (RegistryKey explorerKey = Registry.CurrentUser.OpenSubKey(explorerKeyPath, writable: true))
 
     if (explorerKey != null)
     
         explorerKey.DeleteSubKeyTree("TestSubKey");
     
 

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。【参考方案2】:
RegistryKey registrykeyHKLM = Registry.LocalMachine;
string keyPath = @"Software\Microsoft\Windows\CurrentVersion\Run\MyApp";

registrykeyHKLM.DeleteValue(keyPath);
registrykeyHKLM.Close();

【讨论】:

【参考方案3】:

要删除树中的所有子键/值(〜递归),这是我使用的扩展方法:

public static void DeleteSubKeyTree(this RegistryKey key, string subkey, 
    bool throwOnMissingSubKey)

    if (!throwOnMissingSubKey && key.OpenSubKey(subkey) == null)  return; 
    key.DeleteSubKeyTree(subkey);

用法:

string keyName = @"Software\Microsoft\Windows\CurrentVersion\Run";
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))

   key.DeleteSubKeyTree("MyApp",false);   

【讨论】:

看起来像一些在 .NET 上工作的人也认为这也是个好主意 :) 为 .NET 4.0 添加了 msdn.microsoft.com/en-us/library/dd411622.aspx 请注意,如果DeleteSubKeyTree() 中的第二个参数未指定,它将假定为真并抛出异常,除非在调用OpenSubKey() 后关闭键。【参考方案4】:

删除问题中设置的值:

string keyName = @"Software\Microsoft\Windows\CurrentVersion\Run";
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))

    if (key == null)
    
        // Key doesn't exist. Do whatever you want to handle
        // this case
    
    else
    
        key.DeleteValue("MyApp");
    

查看Registry.CurrentUserRegistryKey.OpenSubKeyRegistryKey.DeleteValue 的文档了解更多信息。

【讨论】:

如何删除整个文件夹?假设我想删除@"Software\TeamViewer"; 使用 Registry.CurrentUser.DeleteSubKeyTree(rootKey) 谢谢!我错过了“真”值,表明我需要对密钥进行写访问才能删除它。 注意:如果您不希望它在值不存在时引发错误,请使用key.DeleteValue("MyApp", false)【参考方案5】:

RegistryKey.DeleteValue

【讨论】:

如何获取RegistryKey对象 DeleteValue 不是静态方法

以上是关于如何在 C# 中删除注册表值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 检查注册表值是不是存在?

C# Winform打包部署时添加注册表信息实现开机启动.

在 Qt 中,如何使用 QSettings 来创建/修改/删除 Windows 注册表项/值?

如何在卸载 MSI 时删除单个注册表值?

C# 通用注册表操作方法

如何从本地机器\软件中删除密钥?