unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Registry;

type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    optRunNone: TRadioButton;
    optRunOnce: TRadioButton;
    optAutoRun: TRadioButton;
    cmbApply: TButton;
    procedure FormCreate(Sender: TObject);
    procedure cmbApplyClick(Sender: TObject);
  private
    { Private declarations }
    procedure GetRunMode();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(sender: TObject);
begin
  GetRunMode();
end;

procedure TForm1.GetRunMode();
var
  reg: TRegistry;
begin
  reg := TRegistry.Create();
  reg.RootKey := HKEY_LOCAL_MACHINE;
  //Определение, как запускается программа (по наличию значений в
  //соответствующих ключах)
  if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False)
  then
  begin
    if reg.ValueExists(Application.Title) then
    begin
      //Программа есть в секции Run - запускается при каждой загрузке
      //Windows
      optAutoRun.Checked := True;
      reg.CloseKey();
      Exit;
    end;
    reg.CloseKey();
  end;

  if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', False)
  then
  begin
    if reg.ValueExists(Application.Title) then
    begin
      //Программа есть в секции RunOnce - запускается один раз при старте
      //Windows
      optRunOnce.Checked := True;
      reg.CloseKey();
      Exit;
    end;
    reg.CloseKey();
  end;

  //Автозапуск программы (рассматриваемым способом) не включен
  optRunNone.Checked := True;

  reg.Free();
end;

//Применение режима запуска программы
procedure TForm1.cmbApplyClick(Sender: TObject);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create();
  reg.RootKey := HKEY_LOCAL_MACHINE;
  //Отмена прошлого режима
  //..удаление параметра из секции Run
  if not optAutoRun.Checked then
    if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False)
    then
    begin
      reg.DeleteValue( Application.Title );
      reg.CloseKey();
    end;
  //..удаление параметра из секции RunOnce
  if not optRunOnce.Checked then
    if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', False)
    then
    begin
      reg.DeleteValue( Application.Title );
      reg.CloseKey();
    end;

  //Установка нового режима (создание параметра в соотвествующей секции)
  if optAutoRun.Checked then
    //..добавление параметра в секцию Run
    if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True)
    then
    begin
      reg.WriteString( Application.Title, Application.ExeName);
      reg.CloseKey();
    end;
  if optRunOnce.Checked then
    //..добавление параметра в секцию RunOnce
    if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True)
    then
    begin
      reg.WriteString( Application.Title, Application.ExeName);
      reg.CloseKey();
    end;

  //Для верности, обновим показания но форме по данным из реестра
  GetRunMode();
end;

end.
