Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programmstart bei Windowsstart festlegen (https://www.delphipraxis.net/12755-programmstart-bei-windowsstart-festlegen.html)

Mitternachtsfalke 3. Dez 2003 17:28


Programmstart bei Windowsstart festlegen
 
Hi
Ich hab ein Programm geschrieben dass bei jedem Windowsstart
automatisch starten soll. Jetzt will ich eine Checkbox machen,
wo man festlegen kann, ob dass Prog das nächste Mal startet.
Bisher habe ich folgendes:

Delphi-Quellcode:
if checkbox1.checked  then
begin
  MyReg:=TRegistry.Create;
  try
    MyReg.RootKey:=hkey_local_machine;
    MyReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
    MyReg.WriteString('Wert_egal',Application.ExeName);
    MyReg.CloseKey;
  finally
    MyReg.Free;
  end; end

  else begin
  MyReg.RootKey:=hkey_local_machine;
  MyReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false);
  if MyReg.ValueExists('Wert_egal') then
    MyReg.DeleteValue('Wert_egal');
  MyReg.CloseKey;
end; end;
...so hoffe das stimmt...

Es sollte ein Wert beim Beenden gespeichert werden, ob die Checkbox
''Checked'' oder ''nicht Checked'' ist. Er müsste dann
beim nächsten Start aulgelesen werden. ...denk ich doch

Kann mir das einer erklären, wie das zu lösen ist?

Gruß MitternachtsFalke

[edit=Admin]Delphi-Tags [ delphi]...[ /delphi] eingefügt. Künftig bitte selber dran denken. ;-) Mfg, Daniel[/edit]

himitsu 3. Dez 2003 17:49

Re: Programmstart bei Windowsstart festlegen
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif und herzlich willkommen in unserer DP-Gemeinde,

schreib das einfach in's OnDestroy-Ereignis deines Formulars.
Dieses wird bein löschen des Formulars ausgeführt, also wenn das Programm beendet wird.
Delphi-Quellcode:
Procedure TForm_.FormDestroy(Sender: TObject);
  Begin
    If CheckBox1.Checked Then Begin
      MyReg := TRegistry.Create;
      Try
        MyReg.RootKey := hkey_local_machine;
        MyReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
        MyReg.WriteString('Wert_egal', Application.ExeName);
        MyReg.CloseKey;
      Finally
        MyReg.Free;
      End;
    End Else Begin
      MyReg.RootKey := hkey_local_machine;
      Try
        MyReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False);
        Ff MyReg.ValueExists('Wert_egal') Then
          MyReg.DeleteValue('Wert_egal');
        MyReg.CloseKey;
      Finally
        MyReg.Free;
      End;
    End;
  End;
PS: mit den [delphi]-Tags kann man den QuellCode lesbarer machen.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Mitternachtsfalke 3. Dez 2003 18:12

Re: Programmstart bei Windowsstart festlegen
 
Vielen Dank für die schnelle Antwort!
Ich werds mal testen.
Doch zu den Close-Prozduren hab ich noch ne kleine Frage...
was ist der Unterschied zwischen

onClose,
onCloseQuery und
onDestroy :gruebel:

Danke nochmal

MitternachtsFalke

Luckie 3. Dez 2003 18:19

Re: Programmstart bei Windowsstart festlegen
 
Sollte sich alles mit der Delphi-Hilfe klären lassen.

Mitternachtsfalke 3. Dez 2003 18:29

Re: Programmstart bei Windowsstart festlegen
 
Das hab ich ja schon aber ich hab ne englische version
und noch nichts richtiges gefunden (was nicht heißen soll, dass
ich kein Englisch kann), nein ich finde keinen passenden Eintrag.
Naja...dann muss ich eben schauen :cry:

Luckie 3. Dez 2003 18:39

Re: Programmstart bei Windowsstart festlegen
 
Form auswählen, im OI auf die Ereignisse gehen, in das betreffende Ereigniss rein klicken, F1 drücken. dann kommt so ein text wie dieser zum Beispiel:
Zitat:

Zitat von Delphi-Hilfe
Use OnClose to perform special processing when the form closes. The OnClose event specifies which event handler to call when a form is about to close.

Oder:
Zitat:

Zitat von Delphi-Hilfe
Use OnCloseQuery to specify the conditions under which the form can close. An OnCloseQuery event handler contains a Boolean CanClose variable that determines whether a form is allowed to close. Its default value is True.

Oder sogar:
Zitat:

Zitat von Delphi-Hilfe
Use OnDestroy to perform special processing when the form is destroyed.

Womit diese Aussage
Zitat:

Zitat von Mitternachtsfalke
und noch nichts richtiges gefunden [..], nein ich finde keinen passenden Eintrag.

Wohl wiederlegt sein dürfte. Ähnliche Ergebnisse erziehlt man, wenn man die betreffenden Stichworte im Index der Hilfe eingibt. :wink:

Mitternachtsfalke 4. Dez 2003 18:31

Re: Programmstart bei Windowsstart festlegen
 
Ok Luckie du hast gewonnen.
Ich wusste noch nicht dass man in Delphi irgendwo
draufklicken und darüber dann sofort Hilfe erhalten
kann. :oops:

'Falke

MathiasSimmack 4. Dez 2003 19:12

Re: Programmstart bei Windowsstart festlegen
 
Ich habe ein Deja vù:
Zitat:

Zitat von Mitternachtsfalke
Delphi-Quellcode:
if checkbox1.checked  then
begin
  MyReg:=TRegistry.Create;
  try
    MyReg.RootKey:=hkey_local_machine;
    MyReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
    MyReg.WriteString('Wert_egal',Application.ExeName);
    MyReg.CloseKey;
  finally
    MyReg.Free;
  end; end

  else begin
  MyReg.RootKey:=hkey_local_machine;
  MyReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false);
  if MyReg.ValueExists('Wert_egal') then
    MyReg.DeleteValue('Wert_egal');
  MyReg.CloseKey;
end; end;

So was ähnliches hatten wir vor ein paar Tagen/Wochen/Monaten schon mal.
  1. HKEY_LOCAL_MACHINE als Ziel kann ohne Admin-Rechte in die Hose gehen.
  2. Warum schreibst du den Registry-Code zweimal? Einmal öffnen, und dann abhängig von der Checkbox den Wert eintragen oder entfernen.
:)

Akut-Programming 5. Dez 2003 07:18

Re: Programmstart bei Windowsstart festlegen
 
Hatte genau dasselbe in meine Anwendung eingebaut gehabt.. schau dir das mal an, wenn du immernoch nich weiter bist. :wink:

Anwendung automatisch starten

Greetz,

MathiasSimmack 5. Dez 2003 07:49

Re: Programmstart bei Windowsstart festlegen
 
Also deine Lösung ist auch nicht gerade das Gelbe vom Ei.
Bei den Schweizern, von denen du abgeschrieben hast, sieht das ein bisschen anders (= besser) aus.

Ich würd´s sogar noch weiter ausbauen, dass man den Registryschlüssel (HKCU oder HKLM) auch wählen kann. Ich wiederhole mich gern: Admin-Rechte! :)

Akut-Programming 5. Dez 2003 08:03

Re: Programmstart bei Windowsstart festlegen
 
Wer hat von den Schweizern abgeschrieben?? :gruebel:

MathiasSimmack 5. Dez 2003 10:30

Re: Programmstart bei Windowsstart festlegen
 
Du - in dem anderen Beitrag. Allerdings hast du´s nicht richtig abgeschrieben, denn wie kommst du in der Prozedur "DelAppInRunOnce" (die Namensähnlichkeit zum SwissDelphiCenter is´ sicher nur Zufall ;)) auf
Delphi-Quellcode:
Reg.Destroy;

Christian Seehase 5. Dez 2003 11:28

Re: Programmstart bei Windowsstart festlegen
 
Moin Mitternachtsfalke,

was auch noch schiefgehen kann ist das:

Delphi-Quellcode:
Application.ExeName
Sollte der Pfad Leerzeichen enthalten, wird das Programm auch nicht ausgeführt, also besser

Delphi-Quellcode:
'"'+Application.ExeName+'"'
oder

Delphi-Quellcode:
'"'+paramstr(0)+'"'

MathiasSimmack 5. Dez 2003 11:33

Re: Programmstart bei Windowsstart festlegen
 
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ß.

Mitternachtsfalke 9. Dez 2003 16:45

Re: Programmstart bei Windowsstart festlegen
 
Vielleicht etwas dumm dass ich hier nochmal anfange aber
besser als noch ein neues Eintrag zum Thema... :oops:


Nur rein des wissens und der Interesse wegen:
(Ich verfolge keine bösen Absichten :angle2:)

Was müsste ich denn beachten, wenn ich keine Adminrechte auf
einem PC hätte.
Oder ist dann ein Eintrag in die Registry nicht möglich?

Gruß
'Falke

MathiasSimmack 9. Dez 2003 19:48

Re: Programmstart bei Windowsstart festlegen
 
Doch, dann legst du den Eintrag eben nicht unter HKEY_LOCAL_MACHINE sondern unter HKEY_CURRENT_USER ab. Beachte dazu bitte den folgenden Auszug aus meinem letzten Posting, das führt dir das ganze ohne eine if-Abfrage vor. Du musst nur mal nach Hier im Forum suchenIsAdmin von NicoDE suchen:
Zitat:

Zitat von MathiasSimmack
Delphi-Quellcode:
const
  iRegRoots : array[boolean]of HKEY =
    (HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE);

{ ... }

if(DoAppToRun(iRegRoots[IsAdmin], // <-- "IsAdmin" von Nico!
  'Run',
  'MeMyselfAndI',
  Format('"%s"',[paramstr(0)]))) then
ShowMessage('Wert eingetragen!');

Abhängig vom Rückgabewert der Funktion "IsAdmin" (bool-Typ) wird entweder HKCU oder HKLM aus dem Bool-Array benutzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz