Índice de la sección dedicada a .NET (en el Guille) Cómo... en .NET

Poner nuestra aplicación en el registro de Windows para que se inicie automáticamente

Código para Visual Basic.NET (VB.NET)

Código para C Sharp (C#)


Publicado el 04/Feb/2004
Actualizado el 07/Oct/2004
Autor: Guillermo 'guille' Som


Como seguramente sabrás, (y si no lo sabes, a partir de ahora ya lo sabes), entre las clases de .NET Framework se incluyen un grupos de clases que nos permiten manejar el registro de Windows.
Entre las cosas que podemos hacer, está lo que te voy a explicar aquí: Poner (y quitar) nuestra aplicación en el registro de Windows para que se inicie de forma automática.
Para lograr esto, tendremos que añadir en la clave:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
una entrada con el nombre de la aplicación (o lo que queramos poner para identificar nuestro ejecutable) y el path de lo que queremos que se ejecute al iniciarse el sistema operativo, bueno, realmente se ejecutará al abrir la sesión de un usuario.

 

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.asp

Mediante 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.htm

Ahora 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.
Guillermo

P.S.
Pulsa aquí, si quieres saber cómo hacer esto mismo pero en Visual Basic 6.0


Código para Visual Basic.NET (VB.NET)El código para VB .NET

'------------------------------------------------------------------------------
' 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

 


Código para C Sharp (C#)El código para C#

//-----------------------------------------------------------------------------
// 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);
        }
    }  
}

 


la Luna del Guille o... el Guille que está en la Luna... tanto monta...