18 junio 2007

Ejecutar un programa al arrancar Windows

Para ejecutar automáticamente nuestra aplicación al arrancar Windows vamos a utilizar la siguiente clave del registro del sistema:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\

Todos los programas que se introduzcan dentro de esa clave (antivirus, monitores del sistema, etc.) arrancarán al iniciar Windows.

Para ello vamos a utilizar el objeto TRegistry. Para ello hay que añadir su unidad correspondiente en uses:

uses Windows, Messages, ..., Registry;

Ahora vamos con el procedimiento encargado de poner nuestro programa
al inicio de Windows:

procedure TFPrincipal.PonerProgramaInicio;
var Registro: TRegistry;
begin
Registro := TRegistry.Create;
Registro.RootKey := HKEY_LOCAL_MACHINE;

if Registro.OpenKey( 'Software\Microsoft\Windows\CurrentVersion\Run', FALSE ) then
begin
Registro.WriteString( ExtractFileName( Application.ExeName ), Application.ExeName );
Registro.CloseKey;
end;

Registro.Free;
end;

El método WriteString toma como primer parámetro la el nombre del valor en el registro y como segúndo parámetro la ruta donde se encuentra el programa a ejecutar. En nuestro caso como nombre del valor le he dado el nombre de nuestro ejecutable y como segundo la ruta desde donde estamos ejecutando el programa en este mismo instante.

Si en un futuro deseamos quitar el programa entonces sólo hay que eliminar la clave:

procedure TFPrincipal.QuitarProgramaInicio;
var Registro: TRegistry;
begin
Registro := TRegistry.Create;
Registro.RootKey := HKEY_LOCAL_MACHINE;

if Registro.OpenKey( 'Software\Microsoft\Windows\CurrentVersion\Run', FALSE ) then
begin
// ¿Existe el valor que vamos a borrar?
if Registro.ValueExists( ExtractFileName( Application.ExeName ) ) then
Registro.DeleteValue( ExtractFileName( Application.ExeName ) );

Registro.CloseKey;
end;

Registro.Free;
end;

Hay ciertos antivirus como el NOD32 que saltan nada más compilar nuestro programa por el simple hecho de tocar la clave Run. Habrá que decirle a nuestro antivirus que nuestro programa no es maligno.

Pruebas realizadas en Delphi 7.

2 comentarios:

Anónimo dijo...

Lo primero gracias por estas rutinas muy sencilla y claras.

Para evitar que NOD32 detecte el código malicioso y no borre el exe al compilar, podemos dividir la clave de registro en varios trozos.
Cualquier otra variación podría valer (esta funciona)


procedure TForm1.PonerProgramaInicio;
var Registro: TRegistry;
Tmpstring,Tmpstring2,Tmpstring3,Tmpstring4: string;
begin
Tmpstring4:='Run';
Registro := TRegistry.Create;
Tmpstring3:='Windows\CurrentVersion\';
Registro.RootKey := HKEY_LOCAL_MACHINE;
Tmpstring2:='\Microsoft\';
tmpstring:='Software';
// todo el rollo anterior para que muchos antivirus como el NOD32 no detecten
//esto como código malicioso

if Registro.OpenKey( Tmpstring+tmpstring2+Tmpstring3+tmpstring4, FALSE ) then
begin
Registro.WriteString( ExtractFileName( Application.ExeName ), Application.ExeName );
Registro.CloseKey;
end;

Registro.Free;
end;

Delphi al Límite dijo...

Es una buena idea eso de partir la cadena del registro en varios trozos, aunque hay antivirus como karpersky que lo detectan en tiempo real.

Muchas gracias por tu aportación.

Publicidad