Publicado el 04/Feb/2004
|
Las clases para manejar el registro del sistema están en el espacio de nombres Microsoft.Win32, en ese espacio de nombres tenemos dos clases que son las que nos permitirán acceder al registro de Windows:
Registry, que contiene métodos estáticos (compartidos en VB) que nos permitirán acceder a las distintas claves del registro, como LocalMachine, que es la que en este ejemplo usaremos, además de las otras claves base o grupos de claves.
Si quieres saber qué otras claves se pueden usar (y su utilidad), puedes mirar esta entrada en la ayuda de Visual Studio .NET:
ms-help://MS.MSDNQTR.2003FEB.3082/cpref/html/frlrfmicrosoftwin32registrymemberstopic.htm
o esta otra en Internet, aunque en inglés:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfmicrosoftwin32registrymemberstopic.asp
y esta en español:
http://msdn.microsoft.com/library/spa/cpref/html/frlrfmicrosoftwin32registrymemberstopic.aspMediante los métodos estáticos de la clase Registry podremos acceder a los métodos que nos permitirán hacer las manipulaciones pertinentes. Por ejemplo, podemos usar el método OpenSubKey para abrir una clave y posteriormente añadir una nueva entrada o para leer una existente.
En este ejemplo usaremos OpenSubKey para abrir la clave, este método devuelve un objeto del tipo RegistryKey que representa la subclave a la que queremos acceder. Con el valor devuelto podremos hacer las operaciones de manejo de los valores, en este ejemplo en particular usaremos los tres más habituales:
GetValue, que nos permitirá recuperar el valor de una clave.
SetValue, que asignará un nuevo valor en una clave (o cambiará el que ya hubiera).
DeleteValue, que eliminará el valor de la clave indicada.
Aunque con esa misma clase también podremos acceder a otra información, como el número de subclaves o un array con los valores o las subclaves de la clave indicada.
Para más información sobre la clase RegistryKey y los miembros de esa clase... como es habitual, en la documentación de Visual Studio .NET:
ms-help://MS.MSDNQTR.2003FEB.3082/cpref/html/frlrfmicrosoftwin32registrykeyclasstopic.htmAhora pasemos a ver el código de la aplicación de ejemplo, en este proyecto de línea de comandos, podremos indicar la clave y el valor que queremos asignar, eliminar o recuperar. Para ello indicaremos como primer parámetro la acción a realizar: /A (asignar), /R (recuperar), /E (eliminar), a continuación indicaremos la clave (dentro de Inicio) que queremos manipular y, en caso de querer asignar un nuevo valor (o cambiar uno existente), en el último parámetro indicaremos el valor que queremos asignar.
En el caso de que usemos valores o claves con espacios, éstos se indicarán dentro de comillas dobles, ya que los parámetros de la línea de comandos se interpretan como valores diferentes los que estén separados por espacios.Un poco más abajo tienes el código tanto para Visual Basic .NET como para C#.
No incluyo ningún proyecto ya que no hace falta, incluso podrías compilar el código usando la línea de comandos, simplemente usando el compilador del lenguaje que elijas (vbc o csc) seguido del nombre del fichero en el que hayas guardado el código que te muestro.Espero que te sea de utilidad.
Nos vemos.
GuillermoP.S.
Pulsa aquí, si quieres saber cómo hacer esto mismo pero en Visual Basic 6.0
'------------------------------------------------------------------------------ ' registroWindowsInicioVB (04/Feb/04) ' Poner nuestra aplicación en el registro para que se inicie automáticamente ' también se comprobará si ya está y cómo quiitarla. ' ' ©Guillermo 'guille' Som, 2004 '------------------------------------------------------------------------------ Option Strict On Imports Microsoft.VisualBasic Imports System Imports Microsoft.Win32 Module Module1 Sub Main(ByVal args() As String) ' En la línea de comandos se indicará la clave y el valor ' El valor será el "path" completo de la aplicación ' que queremos incluir en el registro dentro de la clave indicada ' En el primer parámetro indicaremos la acción a realizar: ' /A Añadir o modificar una clave ' /E Eliminar la clave indicada ' /R Recuperar el valor de la clave indicada, también se puede usar /M ' Recuerda que en este código siempre se manejará la clave Run: ' HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run ' Dim msg As String = String.Format("Para usar esta aplicación debes indicar:{0}" & _ "Para añadir o modificar: /A clave path{0}" & _ "Para eliminar: /E clave{0}" & _ "Para mostrar el valor: /R clave o /M clave", vbCrLf) If args.Length < 2 Then Console.WriteLine(msg) Exit Sub End If ' Dim nombre As String = args(1) Select Case args(0).ToUpper Case "/A", "-A" ' si hay menos de tres argumentos ' es que no se ha indicado el último parámetro If args.Length < 3 Then Console.WriteLine(msg) Exit Sub End If Dim valor As String = args(2) If ponerEnInicio(nombre, valor) Then Console.WriteLine("Se añadió / modificó correctamente la clave...") End If Case "/E", "-E" If quitarDeInicio(nombre) Then Console.WriteLine("Se quitó correctamente la clave...") End If Case "/R", "-R", "/M", "-M" Console.WriteLine(comprobarEnInicio(nombre)) End Select End Sub ' Private Function ponerEnInicio(ByVal nombreClave As String, ByVal nombreApp As String) As Boolean ' Resgistrará en Inicio del registro la aplicación indicada ' Devuelve True si todo fue bien, False en caso contrario ' ' Guardar la clave en el registro ' HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Try Dim runK As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True) ' añadirlo al registro ' Si el path contiene espacios se debería incluir entre comillas dobles If nombreApp.StartsWith(ChrW(34)) = False AndAlso nombreApp.IndexOf(" ") > -1 Then nombreApp = ChrW(34) & nombreApp & ChrW(34) End If runK.SetValue(nombreClave, nombreApp) Return True Catch ex As Exception Console.WriteLine("ERROR al guardar en el registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", vbCrLf, ex.Message, ex.StackTrace) Return False End Try End Function ' Private Function quitarDeInicio(ByVal nombreClave As String) As Boolean ' Quitará de Inicio la aplicación indicada ' Devuelve True si todo fue bien, False en caso contrario ' Si la aplicación no estaba en Inicio, devuelve True salvo que se produzca un error ' Try Dim runK As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True) ' quitar la clave indicada del registo runK.DeleteValue(nombreClave, False) Return True Catch ex As Exception Console.WriteLine("ERROR al eliminar la clave del registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", vbCrLf, ex.Message, ex.StackTrace) Return False End Try ' End Function ' Private Function comprobarEnInicio(ByVal nombreClave As String) As String ' Comprobará si la clave indicada está asignada en Inicio ' en caso de ser así devolverá el contenido, ' en caso contrario devolverá una cadena vacia ' Si se produce un error, se devolverá la cadena de error Try Dim runK As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", False) ' comprobar si está Return runK.GetValue(nombreClave, "").ToString Catch ex As Exception Return String.Format("ERROR al leer el valor de la clave del registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", vbCrLf, ex.Message, ex.StackTrace) End Try End Function End Module
//----------------------------------------------------------------------------- // registroWindowsInicioCS (04/Feb/04) // Poner nuestra aplicación en el registro para que se inicie automáticamente // también se comprobará si ya está y cómo quitarla. // // ©Guillermo 'guille' Som, 2004 //----------------------------------------------------------------------------- using System; using Microsoft.Win32; class Class1 { ////// Punto de entrada principal de la aplicación. /// [STAThread] static void Main(string[] args) { // En la línea de comandos se indicará la clave y el valor // El valor será el "path" completo de la aplicación // que queremos incluir en el registro dentro de la clave indicada // En el primer parámetro indicaremos la acción a realizar: // /A Añadir o modificar una clave // /E Eliminar la clave indicada // /R Recuperar el valor de la clave indicada, también se puede usar /M // Recuerda que en este código siempre se manejará la clave Run: // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run // string msg = String.Format("Para usar esta aplicación debes indicar:{0}" + "Para añadir o modificar: /A clave path{0}" + "Para eliminar: /E clave{0}" + "Para mostrar el valor: /R clave o /M clave",'\n'); if( args.Length < 2 ){ Console.WriteLine(msg); return; } // string nombre = args[1]; switch(args[0].ToUpper()){ case "/A": case "-A": // si hay menos de tres argumentos // es que no se ha indicado el último parámetro if( args.Length < 3 ){ Console.WriteLine(msg); break; } string valor = args[2]; if( ponerEnInicio(nombre, valor) ){ Console.WriteLine("Se añadió / modificó correctamente la clave..."); } break; case "/E": case "-E": if( quitarDeInicio(nombre) ){ Console.WriteLine("Se quitó correctamente la clave..."); } break; case "/R": case "-R": case "/M": case "-M": Console.WriteLine(comprobarEnInicio(nombre)); break; } } // static private bool ponerEnInicio(string nombreClave, string nombreApp) { // Resgistrará en Inicio del registro la aplicación indicada // Devuelve True si todo fue bien, False en caso contrario // // Guardar la clave en el registro // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run try { RegistryKey runK = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); // añadirlo al registro // Si el path contiene espacios se debería incluir entre comillas dobles if( nombreApp.StartsWith("\"") == false && nombreApp.IndexOf(" ") > -1 ) { nombreApp = "\"" + nombreApp + "\""; } runK.SetValue(nombreClave, nombreApp); return true; } catch(Exception ex ) { Console.WriteLine("ERROR al guardar en el registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", '\n', ex.Message, ex.StackTrace); return false; } } // static private bool quitarDeInicio(string nombreClave) { // Quitará de Inicio la aplicación indicada // Devuelve True si todo fue bien, False en caso contrario // Si la aplicación no estaba en Inicio, devuelve True salvo que se produzca un error // try { RegistryKey runK = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); // quitar la clave indicada del registo runK.DeleteValue(nombreClave, false); return true; } catch(Exception ex ) { Console.WriteLine("ERROR al eliminar la clave del registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", '\n', ex.Message, ex.StackTrace); return false; } // } // static private string comprobarEnInicio(string nombreClave) { // Comprobará si la clave indicada está asignada en Inicio // en caso de ser así devolverá el contenido, // en caso contrario devolverá una cadena vacia // Si se produce un error, se devolverá la cadena de error try { RegistryKey runK = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", false); // comprobar si está return runK.GetValue(nombreClave, "").ToString(); } catch(Exception ex ) { return String.Format("ERROR al leer el valor de la clave del registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", '\n', ex.Message, ex.StackTrace); } } }