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.
Lo primero gracias por estas rutinas muy sencilla y claras.
ResponderEliminarPara 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;
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.
ResponderEliminarMuchas gracias por tu aportación.