Hi Mike,
Wie kann ich eine Autostartverknüpfung zur Laufzeit erstellen.
(Option mit Windows Starten z.B.)
Durch Ermitteln des Autostart-Startmenüordners des Benutzers und das Anlegen einer .lnk-Datei über COM in diesem Ordner. Klingt komplizierter als es ist
Da ich aber nicht wirklich weiss wie die Registry arbeitet
lasse ich davon lieber die Finger und will einfach nur eine
Verknüpfung im Autostartmenü, die auch ein weniger erfahrener
Nutzer notfalls von Hand entfernen kann.
Schade, dabei ist es über die Registrierung viel sauberer und wesentlich schneller gelöst.
uses [...], Registry, {für den AutoStart-Link} ComObj, ActiveX, ShlObj;
[...]
type
TForm1 = class(TForm)
[...]
public
{Direkter Eintrag in die Registrierung}
function EnableAutoStartRegistry(AllUsers, Enable: Boolean): Boolean;
{Erstellen/Löschen eines Autostart-Links}
function EnableAutoStartLink(AllUsers, Enable: Boolean): Boolean;
end;
[...]
implementation
function TForm1.EnableAutoStartRegistry(AllUsers, Enable: Boolean): Boolean;
var
R: TRegistry;
KeyName, KeyValue: string;
begin
Result := False;
KeyName := 'MyProgram.exe';
KeyValue := 'C:\MyProgram.exe';
R := TRegistry.Create;
if AllUsers then
R.RootKey := HKEY\_LOCAL\_MACHINE
else
R.RootKey := HKEY\_CURRENT\_USER;
if R.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False) then
begin
if Enable then
begin
R.WriteString(KeyName, KeyValue);
Result := R.ValueExists(KeyName);
end else
begin
if R.ValueExists(KeyName) then
Result := R.DeleteValue(KeyName)
else
Result := True;
end;
R.CloseKey;
end;
end;
Kann mir jemand in einfachen Worten erklären wie ich das am
Besten anstelle? Vielleicht gibt es ja auch ein kleines
Beispielprogramm was ich „zerlegen“ kann um es zu kapieren.
Einen Link zu erstellen ist etwas komplizierter, das erfordert wie gesagt ein bisschen COM-Programmierung, damit - einfach gesagt - Windows selbst den Link einrichtet. Du erstellst ein COM-Objekt, das für die Verknüpfungen zuständig ist, und sprichst es dann über die von den Schnittstellen bereitgestellten Funktionen an.
Um den Autostart-Ordner des Startmenüs zu ermitteln (dort, wo der Link = die .lnk-Datei dann drinnen liegen soll) muss die Registrierung gelesen werden, da steht der Pfad drin. Der Pfad zum Autostart-Ordner für alle Benutzer ist im Schlüssel HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, Wert ‚Common Startup‘ gespeichert, der für den aktuellen Benutzer in HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders im Wert ‚Startup‘. Wenn Du Regedit startest und die Schlüssel (die wie Ordner aussehen) sowie die darin befindlichen Werte (die wie Dateien in jenen Ordnern aussehen) anschaust, kannst Du das leichter nachvollziehen. Auch das obige Beispiel dürfte dann klarer werden, es macht nichts weiter als einen Wert im Run-Schlüssel anzulegen oder zu löschen, für den aktuellen oder für alle Benutzer. Die Registrierung ist nichts wovor man sich fürchten müsste - solange Du nichts kritisches löschst oder änderst, wovon Du nicht weißt, was es ist
function TForm1.EnableAutoStartLink(AllUsers, Enable: Boolean): Boolean;
var
R: TRegistry;
LinkName, LinkPath, LinkFileName, AutoStartPath: string;
IObject: IUnknown;
begin
Result := False;
LinkName := 'MyProgram';
LinkPath := 'C:\MyProgram.exe';
R := TRegistry.Create;
if AllUsers then
R.RootKey := HKEY\_LOCAL\_MACHINE
else
R.RootKey := HKEY\_CURRENT\_USER;
if R.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', False) then
begin
if AllUsers then
AutoStartPath := R.ReadString('Common Startup')
else
AutoStartPath := R.ReadString('Startup');
LinkFileName := AutoStartPath + '\' + LinkName + '.lnk';
if Enable then
begin
IObject := CreateComObject(CLSID\_ShellLink);
with IObject as IShellLink do
begin
SetDescription(PChar(LinkName));
SetPath(PChar(LinkPath));
SetWorkingDirectory(PChar(ExtractFilePath(LinkPath)));
end;
if FileExists(LinkFileName) then
DeleteFile(LinkFileName);
with IObject as IPersistFile do
Save(PWChar(WideString(LinkFileName)), False);
Result := FileExists(LinkFileName);
end else
begin
if FileExists(LinkFileName) then
DeleteFile(AutoStartPath + '\' + LinkName + '.lnk');
Result := not FileExists(LinkFileName);
end;
end;
end;
Der Einfachheit halber habe ich beide Funktionen mit den gleichen Parametern gemacht. ‚AllUsers‘ gibt an, ob der Autostart für alle Benutzer oder nur den aktuellen gemacht werden soll, ‚Enable‘ gibt an, ob der Autostart eingefügt oder entfernt werden soll. Das Result der Funktion ist True, wenn alles glatt gelaufen ist, sonst False. Zum Test richten die Funktionen gleichermaßen einen Autostart für ein Programm namens ‚MyProgram‘ an, welches ‚C:\MyProgram.exe‘ ist.
Ich hoffe die Funktionen sind anhand der Variablennamen aussagekräftig genug, sonst frag ruhig nach.
Und das ganze soll vom Nutzer natürlich auch per Mausklick
rückgängig gemacht werden können.
Die Implementation mit Checkboxen/Mausklicks sei Dir überlassen, dürfte mit den Funktionen möglich sein.
Und allen Wer weiß was Nutzern ein paar schöne Feiertage.
Ebenso
Schönen Gruß,
Rudy