Regedit MiPC[Abrir Regedit.exe en la clave superior MiPC y no en la última clave visitada - Visual basic .NET 2003]
Fecha: 20/Ene/2006 (20 de Enero
de 2006)
|
Resumen del ejercicio
En los sistemas operativos Windows anteriores a XP. Regedit.exe abre siempre en la clave superior del árbol del registro (MiPC). En cambio, en Windows XP, Regedit.exe abre 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.exe en MiPC y nos 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 esto precisamente: abrir Regedit.exe al estilo Windows 95-98.
'Regedit-Mi PC.vbs 'Marcial Carlés - 2002 Dim WSHShell Set WSHShell=Wscript.CreateObject("Wscript.Shell") WSHShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey", "", "REG_SZ" WSHShell.Run "Regedit" Set WSHShell = NothingEste script me ha sido útil durante estos años hasta que me planteé su conversión a .NET.
Espacios de nombres
Es necesario importar 2 espacios de nombres:
'Recuperar o almacenar datos del registro mediante la clase Microsoft.Win32.Registry Imports Microsoft.Win32 'Iniciar y detener procesos del sistema local Imports System.DiagnosticsFuncionamiento 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
Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey
- si el valor de LastKey es "" o LastKey no existe, Regedit.exe 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:
Const cadena As String = "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit"
Dim clave As RegistryKey = 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:
valor = ""
clave.SetValue("LastKey", valor)
- para iniciar una instancia del programa Regedit.exe usamos System.Diagnostics.Process.Start pasándole una cadena con el nombre del ejecutable:
System.Diagnostics.Process.Start("Regedit.exe")'al cargar el formulario Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try 'no hace falta mostrar el formulario Me.Visible = False 'pulsar ESC equivale a pulsar el botón btSalir Me.CancelButton = Me.btSalir '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 cadena As String = "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) Dim clave As RegistryKey = Registry.CurrentUser.OpenSubKey(cadena, True) Dim valor As 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 pollo As Exception 'si hay errores, mostrar un aviso MessageBox.Show("¡ERROR! No ha sido posible ejecutar el programa.", "Regedit MiPC", _ MessageBoxButtons.OK, MessageBoxIcon.Error) 'siempre cerrar el formulario al final Finally Me.Close() End Try End Sub
Espacios de nombres usados en el código de este artículo:
System.Diagnostics
Microsoft.Win32
Fichero con el código de ejemplo: miliuco_regedit.zip - 220 KB
(MD5 checksum: 2E0AC8AEC5283572BEC8910C4FBC376C)