通过代码添加注册表项

时间:2014-02-05 08:53:53

标签: c# wpf windows registry

我正在尝试在程序启动时通过我的代码添加registry key。我对此完全陌生,我不知道如何(并且无法搜索)但我尝试使用此代码:

RegistryKey HTML5Key = Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);

if (HTML5Key != null)
{
    HTML5Key.SetValue("mybrowser.exe", "270f", RegistryValueKind.DWord);
    HTML5Key.Close();
}

但它什么也没做。我究竟做错了什么?我有管理员权限。我试图调试它,但我甚至无法进入if bracket

4 个答案:

答案 0 :(得分:0)

您使用OpenSubKey在注册表中打开密钥,因此如果注册表中不存在指定的密钥,它将返回null。这就是你的代码无效的原因。检查是否存在子密钥,然后将其打开以进行写入。

您想要打开HKEY_CURRENT_USER子密钥的代码中又出现一个错误,因此编写代码如下

Registry.CurrentUser.OpenSubKey("SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", true)

答案 1 :(得分:0)

您可以使用以下代码在注册表中写入值。

private string _subKey = "Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION";

private string SubKey
{
    get { return _subKey; }
    set { _subKey = value; }
}

private RegistryKey _baseRegistryKey = Registry.LocalMachine;

private RegistryKey BaseRegistryKey
{
    get { return _baseRegistryKey; }
    set { _baseRegistryKey = value; }
}

 private bool WriteDbToRegistry(string keyName, object value)
{
    try
    {
        var rk = BaseRegistryKey;
        var sk1 = rk.CreateSubKey(SubKey);
        if(sk1 != null) sk1.SetValue(keyName.ToUpper(), value);
        return true;
    }
    catch(Exception e)
    {
        MessageBox.Show("Please run your App as Administrator.", "Administrator");
        return false;
    }
}

 bool results = WriteDbToRegistry("Keyname", "2710");

从注册表中获取价值..

   public string GetRegistryValue()
    {
        var rk = BaseRegistryKey;
        var sk1 = rk.OpenSubKey(SubKey);
            try
            {
                return (string)sk1.GetValue("Keyname");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "some message");
                return null;
        }
    }

答案 2 :(得分:0)

我把这个放在一起,对JasRaj先前给出的代码进行了一些细微的修改,以创建注册表项:

private string _subKey = "SOFTWARE\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION";
private string SubKey
{
    get { return _subKey; }
    set { _subKey = value; }
}

private RegistryKey _baseRegistryKey = Registry.LocalMachine;  

private RegistryKey BaseRegistryKey
{
    get { return _baseRegistryKey; }
    set { _baseRegistryKey = value; }
}

 private bool WriteDbToRegistry(string keyName, object value)
{
    try
    {
        var rk = BaseRegistryKey;
        var sk1 = rk.OpenSubKey(SubKey,true); //true is required for making it writable
        if (sk1 != null)
        {
            sk1.SetValue(keyName, value,RegistryValueKind.DWord); //dword,qword 
            rk.Close();
            sk1.Close();
            return true;
        }
        else
        {
            rk.Close();
            sk1.Close();
            return false;
        }

    }
    catch(Exception e)
    {
        MessageBox.Show(e.Message);
        return false;
    }
}

 public string GetRegistryValue(string keyname)
 {
     var rk = BaseRegistryKey;
     var sk1 = rk.OpenSubKey(SubKey);
     try
     {
         return sk1.GetValue(keyname).ToString();
     }
     catch (Exception e)
     {
         MessageBox.Show(e.Message, "Error");
         return null;
     }
 }

答案 3 :(得分:0)

您的代码存在两个问题:

  • 您可能无权写入HKEY_LOCAL_MACHINE
  • 您没有写到正确的位置并且使用了无效的值

您的问题是您正在写入HKEY_LOCAL_MACHINE,并且您很可能无权在普通用户帐户下写入。除非您是管理员并且在提升的权限下运行,否则您无法在那里写。但是,幸运的是,您不需要写HKLM,但您可以写入HKCU注册表允许

此外,“270F”应该是一个不是字符串的数字,因此应该使用不带引号的0x270F

以下代码是我在其中一个应用程序中用于设置浏览器模拟的代码:

using (var rk = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",true))
{
    dynamic value = rk.GetValue("MarkdownMonster.exe");
    if (value == null)
        rk.SetValue(exename, (uint) 11001, RegistryValueKind.DWord);                    
}