Regedit en la clave superior desde C# y VB

Abrir el Editor del Registro (Regedit) en la clave superior Mi PC como en las versiones antiguas de Windows y no en la última clave visitada manipulando cadenas del registro, con C# y Visual Basic

En los sistemas operativos Windows anteriores a XP el programa Regedit abre siempre en la clave superior del árbol del registro (Mi PC). En cambio, en Windows XP y posteriores, abre en la última clave visitada. Esto es muy cómodo cuando se necesita abrir con frecuencia el registro para tareas de mantenimiento o configuración. Sin embargo algunas personas pueden preferir el comportamiento anterior. En este ejercicio se diseña una aplicación para abrir Regedit en MiPC y sirve para mostrar cómo acceder al registro de Windows desde Visual Basic .NET

Visual Basic Script

Marcial Carlés diseñó en el año 2002 un script de Visual Basic que hace ésto precisamente: abrir Regedit.exe al estilo Windows 95-98. Este script ha sido útil durante años hasta que me planteé su conversión a .NET.

'Regedit-Mi PC.vbs
'Marcial Carlés - 2002
Dim WSHShell
Set WSHShell=Wscript.CreateObject("Wscript.Shell")
WSHShell.RegWrite "HKCUSoftwareMicrosoftWindowsCurrentVersionAppletsRegeditLastKey", "", "REG_SZ"
WSHShell.Run "Regedit"
Set WSHShell = Nothing

Espacios de nombres

Es necesario importar 2 espacios de nombres:

using System;
using System.Windows.Forms;
// Recuperar o almacenar datos del registro mediante la clase Microsoft.Win32.Registry
using Microsoft.Win32;


Funcionamiento del programa

Al ejecutar el programa, sin que se muestre el formulario de la aplicación, arranca Regedit.exe.La última clave visitada en el registro se guarda en

MiPC\Software\Microsoft\Windows\CurrentVersion\Applets\RegeditLastKey

Si el valor de LastKey es «» o LastKey no existe, Regedit abre en MiPC. Para manipular claves del registro usamos objetos RegistryKey y sus métodos GetValue y SetValue.

Para abrir una clave, usamos un objeto RegistryKey y su método OpenSubKey al que le pasamos 2 parámetros:

  • cadena con la ruta a la clave que queremos abrir:
// constante que almacena la cadena con la entrada del registro en la que se guarda la última clave visitada,
// la cadena no empieza por HKEY_CURRENT_USER porque al asignar un valor a la variable clave (RegistryKey)
// se usa el método OpenSubKey, pasado al campo superior apropiado (CurrentUser en este caso)
const string cadena = @"Software\Microsoft\Windows\CurrentVersion\Applets\Regedit";
// objeto RegistryKey que permite manipular valores del registro con sus métodos GetValue y SetValue,
// el método OpenSubKey tiene 2 parámetros:
// - una cadena con la ruta a la clave
// - variable booleana para indicar si la clave es modificable (True) o no (False)
RegistryKey clave = Registry.CurrentUser.OpenSubKey(cadena, true);

variable booleana para indicar si la clave es modificable (True) o no (False).

Para asignar el valor «» a LastKey usamos el método SetValue:

// para asignar un valor a la clave LastKey
valor = "";
clave.SetValue("LastKey", valor);

Para iniciar una instancia del programa Regedit usamos Process.Start pasándole una cadena con el nombre del ejecutable:

// comenzar un programa pasando una cadena con el nombre del ejecutable
System.Diagnostics.Process.Start("Regedit.exe");


Código principal

//al cargar el formulario
private void Form1_Load(object sender, EventArgs e)
{
    try
    {
	// no hace falta mostrar el formulario para utilizar el programa
	this.Visible = false;
	// constante que almacena la cadena con la entrada del registro en la que se guarda la última clave visitada,
	// la cadena no empieza por HKEY_CURRENT_USER porque al asignar un valor a la variable clave (RegistryKey)
	// se usa el método OpenSubKey, pasado al campo superior apropiado (CurrentUser en este caso)
	const string cadena = @"Software\Microsoft\Windows\CurrentVersion\Applets\Regedit";
	// objeto RegistryKey que permite manipular valores del registro con sus métodos GetValue y SetValue,
	// el método OpenSubKey tiene 2 parámetros:
	// - una cadena con la ruta a la clave
	// - variable booleana para indicar si la clave es modificable (True) o no (False)
	RegistryKey clave = Registry.CurrentUser.OpenSubKey(cadena, true);
	string valor = default(string);
	// 
	// para recuperar el valor de la clave LastKey
	// valor = clave.GetValue("LastKey", "?").ToString
	// 
	// para asignar un valor a la clave LastKey
	valor = "";
	clave.SetValue("LastKey", valor);
	// comenzar un programa pasando una cadena con el nombre del ejecutable
	System.Diagnostics.Process.Start("Regedit.exe");
    }
    catch (Exception pollo)
    {
	// si hay errores, mostrar un aviso excepto si el error es por pulsar el botón NO en el 
	// diálogo que aparece para abrir Regedit como administrador y no arrancar el programa
	if (pollo.ToString().Contains("Win32Exception") == false)
	{
	    MessageBox.Show("Error al ejecutar el programa.\n\r" + pollo.ToString());
	}
	//else
	//{
	//    MessageBox.Show("Has cancelado el arranque de Regedit.exe");
	//}
    }
    finally
    {
	//siempre cerrar el formulario al terminar
	this.Close();
    }
}

Puedes descargar un archivo ZIP con las aplicaciones C# y VB.