Autor |
Beitrag |
Robii
      
Beiträge: 236
|
Verfasst: So 21.06.09 16:00
Guten Mittag,
wollte fragen, wie ich mein Programm im Autostart verankern kann, so das es von alleine startet, wenn man den Pc einschaltet. Habe bei Google.de gelsen, das ich es in folgenden Ordner
Zitat: | C:\Users\*****\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup |
kopieren muss. Allerdings ist der Benuztername ja auf jedem Computer anders und nicht jeder Computer
hat Windows Vista, wodurch sich der Pfad ja auch vom Betriebssystem abhänig ändert.
Gruß.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: So 21.06.09 16:07
Ist zwar nicht der Ordner Autostart, sondern die Registry, aber vielleicht hilft dir das schon.
www.delphi-treff.de/...tostart%20schreiben/
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 16:21
[Verständnisfrage]
Zitat: |
Folgen der Aufruf führt das eigene Programm beim nächsten Hochfahren von Windows aus, sofern sich der gleiche Benutzer anmeldet.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce); end; |
|
Heißt das, wenn ich diesen Code bei der Installation aufrufe wird mein Programm beim nächsten WindowsStart in automatisch gestartet oder muss ich bei jedem WindowsStart den Code aufrufen, um das Programm zu starten ? Wobei letztere Möglichkeit für mich sehr sinnlos erscheint.
Gruß
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: So 21.06.09 16:32
Mit dem Code wie er da steht, wird das Programm nur einmal beim nächsten Neustart ausgeführt, danach nicht mehr.
Woran das liegt, und wie man es ändert, darfst du nun selber rausfinden - ist ja nur eine Zeile 
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 16:47
Delphi-Quelltext 1: 2: 3: 4: 5:
| CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce);
Ersetzt durch :
CreateAutorunEntry(Application.Title, ParamStr(0), akUserRun); |
Dann müsste es so klappen, oder?
Gruß
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: So 21.06.09 16:55
Also die Prozedur verankert das Programm in der Registry. Er fragte nach Autostart im Startmenü.
Hier eine Funktion für Verknüpfungen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure CreateShortCut(ShortCut, Application, Parameters, WorkDir: String; SW_State: Integer; IconFile: String; IconIndex: Byte); var SCObject: IUnknown; SCSLink: IShellLink; SCPFile: IPersistFile; WFName: WideString; begin SCObject := CreateComObject(CLSID_ShellLink); SCSLink := SCObject as IShellLink; SCPFile := SCObject as IPersistFile; SCSLink.SetPath(PChar(Application)); SCSLink.SetArguments(PChar(Parameters)); SCSLink.SetWorkingDirectory(PChar(WorkDir)); SCSLink.SetShowCmd(SW_State); SCSLink.SetIconLocation(PChar(IconFile), IconIndex); WFName := ShortCut; SCPFile.Save(PWChar(WFName), False); end; |
Dabei müßten
ShortCut der Ort der Verknüpfung sein, also z.B. der Autostartordner
Application der Programmpfad der Anwendung
Parameters die Parameter der Anwendung
WorkDir der Arbeitsordner der Anwendung
SW_State die Art der Ausführung, z.B. SW_NORMAL
IconFile der IconPfad (kann auch eine Exe sein)
IconIndex die Nummer des Icons (0 für ersten)
Jetzt mußt du nur noch eine Funktion für virtuelle Verzeichnisse für den ShortCut Parameter finden. Davon gibt es im Forum aber jede Menge.
_________________ Popov
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: So 21.06.09 17:01
Popov hat folgendes geschrieben : |
Jetzt mußt du nur noch eine Funktion für virtuelle Verzeichnisse... |
Das geht so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| function GetShellFolder(CSIDL: integer): string; var pidl : PItemIdList; FolderPath : string; SystemFolder : Integer; Malloc : IMalloc; begin Malloc := nil; FolderPath := ''; SHGetMalloc(Malloc); if Malloc = nil then begin Result := FolderPath; Exit; end; try SystemFolder := CSIDL; if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then begin SetLength(FolderPath, max_path); if SHGetPathFromIDList(pidl, PChar(FolderPath)) then begin SetLength(FolderPath, length(PChar(FolderPath))); end; end; Result := FolderPath; finally Malloc.Free(pidl); end; end; |
Quelle: www.michael-puff.de/Artikel/HOMEDIR.shtml
Delphi-Quelltext 1:
| CreateShortcut(IncludeTrailingPathDelimiter(GetShellFolder(CSIDL_APPDATA)) + 'Microsoft\Windows\Start Menu\Programs\Startup\namederverknüpfung.lnk', Application.ExeName, '', '', SW_NORMAL, Application.Exename, 0); |
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 17:38
Jetzt habt ihr mich alle verwirrt.
Ich dachte, dass ich mit dieser Funktion
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| uses Registry;
function CreateAutorunEntry(const AName, AFilename: string; const AKind: TAutorunKind): Boolean; var Reg: TRegistry; begin Result:=False; Reg := TRegistry.create; try if (AKind=akUserRun) or (AKind=akUserRunOnce) then Reg.Rootkey:= HKEY_CURRENT_USER else Reg.RootKey := HKEY_LOCAL_MACHINE;
case AKind of akRun, akUserRun : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); akRunOnce, akUserRunOnce: Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True); akRunServices : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServices', True); akRunServicesOnce : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServicesOnce', True); end; Reg.WriteString(AName, AFilename); finally Reg.Free; end; end; |
Und diesem Aufruf:
Delphi-Quelltext 1: 2: 3:
| begin CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce); end; |
In meiner Anwendung, diese in den Autostart legen kann, so das sie jedesmal, wenn der Computer gestartet
wird aufgerufen wird.
End.
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: So 21.06.09 17:55
Es gibt einige Autostarts unter Windows. So gibt es den Run-Ordner in der Registry und den Autostart-Ordner in deinem Startmenü. Welchen du benutzt ist deine Sache, aber der Autostart-Ordner ist für den Nutzer einfacher. Wenn er nicht will, daß ein Programm bei Start ausgeführt wird, kann er die Verknüpfung leichter löschen. Bei Run in der Registry muß sich der Nutzer etwas genauer mit dem System auskennen.
_________________ Popov
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 18:17
Ok, viel interessanter ist aber, ob das was ich da gepostet habe, so funktioniert?
Gruß
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: So 21.06.09 18:24
Spricht was dagegen, es einfach auszuprobieren?
Wenn du nur den Rechner nicht neu starten möchtest: Schau halt in der Registry (Start -> Ausführen -> regedit) nach, ob der Eintrag erstellt wird.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 19:15
Kann mir jemand die Funktion, die ich oben gepostet hatte, evtl. nocheinmal Schritt für Schritt erklären?
Verstehe diese nicht richtig, hoffe, das wenn ich sie verstehe, schlauer werde. Was ist denn, wenn ich in
meinem Programm P1 das Programm P2 in den Autostart einbinden möchte, bzw wie müsste der Aufruf dann aussehen?
Delphi-Quelltext 1:
| CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce); |
End.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: So 21.06.09 19:23
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 19:27
Nein  Du hattest mich falschverstanden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| uses Registry;
function CreateAutorunEntry(const AName, AFilename: string; const AKind: TAutorunKind): Boolean; var Reg: TRegistry; begin Result:=False; Reg := TRegistry.create; try if (AKind=akUserRun) or (AKind=akUserRunOnce) then Reg.Rootkey:= HKEY_CURRENT_USER else Reg.RootKey := HKEY_LOCAL_MACHINE;
case AKind of akRun, akUserRun : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); akRunOnce, akUserRunOnce: Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True); akRunServices : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServices', True); akRunServicesOnce : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServicesOnce', True); end; Reg.WriteString(AName, AFilename); finally Reg.Free; end; end; |
Diese Funktion wollte ich erklärt haben, da ich diese nicht verstehe. Also die Vorgehensweise.
Gruß
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: So 21.06.09 19:33
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| uses Registry;
function CreateAutorunEntry(const AName, AFilename: string; const AKind: TAutorunKind): Boolean; var Reg: TRegistry; begin Result:=False; Reg := TRegistry.create; try if (AKind=akUserRun) or (AKind=akUserRunOnce) then Reg.Rootkey:= HKEY_CURRENT_USER else Reg.RootKey := HKEY_LOCAL_MACHINE;
case AKind of akRun, akUserRun : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); akRunOnce, akUserRunOnce: Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True); akRunServices : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServices', True); akRunServicesOnce : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServicesOnce', True); end; Reg.WriteString(AName, AFilename); finally Reg.Free; end; end; |
Weißt du jetzt wie die Routine funktioniert? Falls nicht solltest du 1. mal regedit starten und dich ein bisschen in Registry umschauen damit du weißt wie das Teil funkioniert und 2. ein Delphi-Registry-Tutorial lesen (Forumsuche benutzen)
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 19:39
Danke, das hat mir sehr geholfen. Eine Frage ist dabei jedoch aufgekommen, wo ist der Unterschied zwischen
Einem ganz Normalen Autostart und einem Normalen Autostart für einen Dienst, bzw was ist ein Dienst ?
Gruß
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: So 21.06.09 19:41
Robii hat folgendes geschrieben : | Danke, das hat mir sehr geholfen. Eine Frage ist dabei jedoch aufgekommen, wo ist der Unterschied zwischen
Einem ganz Normalen Autostart und einem Normalen Autostart für einen Dienst, bzw was ist ein Dienst ?
Gruß |
de.wikipedia.org/wiki/Windows-Systemdienst
|
|
Robii 
      
Beiträge: 236
|
Verfasst: So 21.06.09 19:45
Danke. Hab es jetzt verstanden 
|
|
|