Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#14

Re: Programmstart bei Windowsstart festlegen

  Alt 5. Dez 2003, 11:33
Da toms vom SwissDelphiCenter anwesend ist, hier mal eine Idee zur Diskussion, basierend auf diesem Beitrag. Es bezieht sich zwar mehr auf den Beitrag, den Akut-Programming hervorgekramt hat, aber egal ...

Weil sich Hauptpfad ja nicht ändert (egal ob man in HKCU oder HKLM schreibt), habe ich diesen als globale Konstante abgelegt:
Delphi-Quellcode:
uses
  Registry;

const
  szWinKey = 'Software\Microsoft\Windows\CurrentVersion\';
Und hier nun die drei Funktionen. In allen lässt sich der Root, sowie der gewünschte Run-Schlüssel (Run, RunOnce) und natürlich der Name des Wertes festlegen. Die erste Funktion hat logischerweise noch einen vierten Parameter - für das Programm, das eingetragen werden soll:
Delphi-Quellcode:
function DoAppToRun(const iRegRoot: HKEY;
  szRunKey, szRunName, szAppName: string): boolean;
var
  reg : TRegistry;
begin
  Result := false;
  reg := TRegistry.Create;
  if(reg <> nil) then
    with reg do
    try
      RootKey := iRegRoot;
      if(OpenKey(szWinKey + szRunKey,true)) then
      try
        WriteString(szRunName,szAppName);
        // "try/finally/end", weil "WriteString" eine
        // Exception auslöst, wenn der Wert nicht
        // geschrieben werden konnte (s. F1)

        Result := ValueExists(szRunName);
      finally
        CloseKey;
      end;
    finally
      Free;
    end;
end;

function IsAppInRun(const iRegRoot: HKEY;
  szRunKey, szRunName: string): boolean;
var
  reg : TRegistry;
begin
  Result := false;
  reg := TRegistry.Create(KEY_READ);
  // zum Auslesen kann man die Registry
  // auch "nur lesend" öffnen

  if(reg <> nil) then
    with reg do
    try
      RootKey := iRegRoot;
      if(OpenKey(szWinKey + szRunKey,false)) then
      try
        Result := ValueExists(szRunName);
      finally
        CloseKey;
      end;
    finally
      Free;
    end;
end;

function DelAppFromRun(iRegRoot: HKEY;
  const szRunKey, szRunName: string): boolean;
var
  reg : TRegistry;
begin
  Result := false;
  reg := TRegistry.Create;
  if(reg <> nil) then
    with reg do
    try
      RootKey := iRegRoot;
      if(OpenKey(szWinKey + szRunKey,false)) then
      // s. Code vom SwissDelphiCenter; dort wird der
      // Schlüssel mit "true" geöffnet - also notfalls
      // angelegt.
      // Wieso? Der Eintrag soll doch gelöscht werden,
      // und das ist nur möglich, wenn auch der
      // Schlüssel existiert. Also: "false" reicht.

      try
        if(ValueExists(szRunName)) then
          Result := DeleteValue(szRunName);
      finally
        CloseKey;
      end;
   finally
     Free;
   end;
end;
Beispiele:
Delphi-Quellcode:
// Rein, ...
if(DoAppToRun(HKEY_CURRENT_USER,
  'Run',
  'MeMyselfAndI',
  Format('"%s"',[paramstr(0)]))) then
ShowMessage('Wert eingetragen!');

// ... & raus
if(DelAppFromRun(HKEY_CURRENT_USER,
  'Run',
  'MeMyselfAndI')) then
ShowMessage('Wert entfernt');

// und für Besitzer der Kerio PFW unter Win9x
if(IsAppInRun(HKEY_LOCAL_MACHINE,
  'RunServices',
  'PersFw')) then
ShowMessage('Eintrag von Kerio PFW gefunden');


// oder als Demo für die Benutzerrechte
// (die Funktion "IsAdmin" von NicoDE sollte in
// der DP zu finden sein)
const
  iRegRoots : array[boolean]of HKEY =
    (HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE);

{ ... }

if(DoAppToRun(iRegRoots[IsAdmin],
  'Run',
  'MeMyselfAndI',
  Format('"%s"',[paramstr(0)]))) then
ShowMessage('Wert eingetragen!');
// hat der User Admin-Rechte, landet der Eintrag
// in HKLM, ansonsten in HKCU
Gruß.
  Mit Zitat antworten Zitat