none
C# Express 2010, RegistryKey setzen funktioniert nicht RRS feed

  • Frage

  • Hallo,

    auf dem XP-Rechner (auch auf Server 2003) versuche ich den RegistryKey für den Bildschirmschoner zu ändern.

    Code:

    private void writeInRegistry() 
    
    {
    	RegistryKey rk = Registry.CurrentUser; 
    	RegistryKey rkSoftware = rk.OpenSubKey("Control Panel\\Desktop", true); 
    
    	if (rkSoftware != null)
    	{
    		//MessageBox.Show(rkInstaller.View.ToString());
    		rkSoftware.SetValue("120", "ScreenSaveTimeout"); 
    
    		//rkInstaller.SetValue("value2", "test2");
    		rkSoftware.Close();
    	}
    
    	rk.Close();
    }

     

    Das Program endet und bringt keine Fehlermeldung, wenn ich aber den Eintrag unter Eigenschaften/Bildschirmschoner überprüfe steht dort immer noch der alte Wert. Ich habe Admin-Rechte auf dem Rechner. Ich habe festgestellt, dass auch wenn ich die Registry mit "Regedit" manuell editiere, wird der neue Wert für ScreeSaveTimeOut angenommen (und auch im Registrykey angezeigt), schlisse ich dann Regedit, öffne die Eigenschaften/Bildschirmschoner und stelle fest, dass der alte Wert immer noch da ist...

    Dienstag, 1. Februar 2011 15:58

Antworten

  • var regkey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
    
          if (regkey.GetValue("ScreenSaveTimeout") == null)
          {
            Console.WriteLine("no value");
            regkey.SetValue("ScreenSaveTimeout", "120");
          }
          else
          {
            Console.WriteLine(regkey.GetValue("ScreenSaveTimeout"));
          }
    
         Console.ReadKey();
         regkey.Close();
    

    Das ist alles was du brauchst, du hast nur die werte von SetValue vertauscht!

    Grüße Silvio

    Dienstag, 1. Februar 2011 16:50

Alle Antworten

  • ..und noch eins, im Deklarationsbereich habe ich:

    [assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum, ViewAndModify ="HKEY_CURRENT_USER")]
    Dienstag, 1. Februar 2011 16:00
  • var regkey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
    
          if (regkey.GetValue("ScreenSaveTimeout") == null)
          {
            Console.WriteLine("no value");
            regkey.SetValue("ScreenSaveTimeout", "120");
          }
          else
          {
            Console.WriteLine(regkey.GetValue("ScreenSaveTimeout"));
          }
    
         Console.ReadKey();
         regkey.Close();
    

    Das ist alles was du brauchst, du hast nur die werte von SetValue vertauscht!

    Grüße Silvio

    Dienstag, 1. Februar 2011 16:50
  • Hallo P

    ob das System hier wirklich gleich die neuen Werte übernimmt ist kein .NET-Thema mehr,
    ich denke da wäre ein ordentlicher API-Einsatz besser, zB
    SystemParametersInfo ( SPI_SETSCREENSAVETIMEOUT ...)
    http://www.codeproject.com/Questions/99654/ScreenSaveTimeOut-Registry-updation-not-Reflected-.aspx

    und/oder gar die UpdatePerUserSystemParameters oä Massnahmen/APIs.
    Dienstag, 1. Februar 2011 19:28
  • Hallo Silvio,

     

    vielen Dank für Deine Hilfe. Es ist ein Teilerfolg zu verbuchen.

    1. Der Wert wird mit Deinem Code richtig in die Registry eingetragen und ist (regedit.exe) sichtbar.

    2. Die Windows-GUI (Eigenschaften/Bildschirmschoner) "weiss" aber NICHTS davon und der alte Wert wird angezeigt. Folge - der BS reagiert nicht auf den neuen Registryeintrag und alles bleibt beim alten.

    3. Nach dem Neustart vom PC wird aber der neue Registrywert erkannt (auch in GUI richtig angezeigt) und der BS schaltet sich wie gewünscht ein.

    4. Vermutung: offensichtlich die Einstellung mit Windows-GUI erzwingt erneutes Registryeinlesen(??), was der direkte Zugriff auf Registry nicht macht?

    Mittwoch, 2. Februar 2011 07:52