繁体   English   中英

通过代码添加注册表项

[英]Add registry key through code

我正在尝试在程序启动时通过代码添加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

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

您想要打开HKEY_CURRENT_USER子键的代码中还有一个错误,因此编写代码如下

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

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

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

我将其与对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;
     }
 }

您的代码有两个问题:

  • 您可能没有写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);                    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM