2014-02-05 5 views
0

Я пытаюсь добавить 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.

ответ

0

Вы используете OpenSubKey, чтобы открыть ключ в реестре, поэтому, если указанный ключ не существует в реестре, он вернет null. Вот почему ваш код не работает. Проверьте, существует или нет суб-ключ, а затем откройте его для написания.

Еще одна ошибка в коде вы хотите открыть HKEY_CURRENT_USER суб ключ, чтобы написать код следующим образом

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

Я попытался с 'HTML5Key.OpenSubKey («browser.exe», правда),' без успеха, его дает мне и ошибку исключения на этот раз. Должен ли я объявить это каким-либо другим способом? – proah

+0

Я изменил свой ответ сейчас. – Sameer

+0

Конечно, я написал неправду ... «HKEY_LOCAL_MACHINE» - это тот, который я хочу открыть. – proah

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

Где это следует вставить? Я не могу найти правильный путь. – proah

+0

выше Я дал вам два метода для записи значения в реестр и получить значение из реестра .. вы можете добавить туда, где хотите .. –

+0

Спасибо, я просмотрю ваш ответ, когда вернусь домой. – proah

0

Я положил это вместе с небольшими изменениями в коде ранее заданной Джасрадж, чтобы создать запись реестра:

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

Есть две проблемы с вашим кодом:

  • Вы, вероятно, не имеет разрешения на запись в HKEY_LOCAL_MACHINE
  • Вы не пишете в нужное место и недопустимое значение используется

Ваша проблема заключается в том, что вы пишете в HKEY_LOCAL_MACHINE, и вы, скорее всего, дон» t иметь разрешения на запись там под обычной учетной записью пользователя. Если вы не являетесь администратором и работаете под повышенными правами, вы не можете писать там. Тем не менее, за то, что вы пытаетесь сделать к счастью, вам не нужно писать 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);      
} 
Смежные вопросы