C# 通过代码添加注册表项

C# 通过代码添加注册表项,c#,wpf,windows,registry,C#,Wpf,Windows,Registry,我试图在程序启动时通过我的代码添加一个注册表项。我对此一无所知,不知道如何(也无法搜索),但我已尝试使用以下代码: RegistryKey HTML5Key = Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION", true); if (

我试图在程序启动时通过我的代码添加一个
注册表项。我对此一无所知,不知道如何(也无法搜索),但我已尝试使用以下代码:

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括号

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

代码中还有一个错误,您想打开
HKEY\U CURRENT\U 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_计算机的权限
  • 您没有写入正确的位置,使用了无效的值
您的问题是,您正在向HKEY_LOCAL_计算机进行写入,并且您很可能没有在普通用户帐户下写入的权限。除非您是管理员并且在提升的权限下运行,否则您不能在那里写入。然而,幸运的是,您不需要编写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);                    
}

该在哪里插入?我找不到正确的方法。上面我给了你两种方法,一种是将值写入注册表,另一种是从注册表中获取值。你可以在任何地方添加。谢谢,我回家后会查看你的答案。我尝试使用你的代码,但似乎无法使其正常工作。如果我把它放在
InitializeComponent()下,我收到大量错误。如果我把它放在处理程序所在的位置,代码什么也不做。此外,我不理解行
bool results=WriteDbToRegistry(“Keyname”,“2710”)的用途HTML5Key.OpenSubKey(“browser.exe”,true)没有成功,这一次它给了我和异常错误。我应该以任何其他方式声明吗?我现在修改了我的答案检查。当然我现在写错了
HKEY\U LOCAL\U MACHINE
是我要打开的机器。现在使用
Registry.LocalMachine.OpenSubKey(“软件\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE\u浏览器\u仿真”,true)进行尝试返回vaule
null
。在64位窗口上,部分注册表项分别存储在32位应用程序和64位应用程序中,并映射到单独的逻辑注册表视图中。如果您不使用64位Windows PC,请使用
“软件\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE\u浏览器\u仿真”