[英]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,并且您很可能没有使用普通用户帐户在此处写权限。 除非您是管理员并以提升的权限运行,否则您将无法在此处进行写操作。 但是,幸运的是,您无需写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.