Wie kann ich programmatisch eine .lnk sein Ziel zu ändern?
-
26-09-2019 - |
Frage
Gibt es eine Möglichkeit, eine Windows-Verknüpfung (.lnk-Datei) zu öffnen und das Ziel ändern? Ich fand den folgenden Code-Schnipsel, die mir das aktuelle Ziel zu finden, aber es ist eine schreibgeschützte Eigenschaft:
Shell32::Shell^ shl = gcnew Shell32::Shell();
String^ shortcutPos = "C:\\some\\path\\to\\my\\link.lnk";
String^ lnkPath = System::IO::Path::GetFullPath(shortcutPos);
Shell32::Folder^ dir = shl->NameSpace(System::IO::Path::GetDirectoryName(lnkPath));
Shell32::FolderItem^ itm = dir->Items()->Item(System::IO::Path::GetFileName(lnkPath));
Shell32::ShellLinkObject^ lnk = (Shell32::ShellLinkObject^)itm->GetLink;
String^ target = lnk->Target->Path;
Ich kann nichts finden, das Ziel zu ändern. Ist meine einzige Option, um eine neue Verknüpfung zu erstellen und die alten zu überschreiben? ..und wenn ja, wie mache ich das?
Lösung
Es ist nicht schreibgeschützt ist, Gebrauch lnk-> Pfad statt, gefolgt von lnk-> Save (). Vorausgesetzt, dass Sie Schreibrechte auf die Datei haben. C # -Code, der die gleiche Sache tut, ist in meiner Antwort in dieses Thema .
Andere Tipps
Recreating eine Verknüpfung mit WSH
Sie können eine bestehende Verknüpfung entfernen und einen neuen mit dem neuen Ziel erstellen. Um einen neuen zu erstellen, können Sie das folgende Snippet verwenden:
public void CreateLink(string shortcutFullPath, string target)
{
WshShell wshShell = new WshShell();
IWshRuntimeLibrary.IWshShortcut newShortcut = (IWshRuntimeLibrary.IWshShortcut)wshShell.CreateShortcut(shortcutFullPath);
newShortcut.TargetPath = target;
newShortcut.Save();
}
Für den Moment, ich sehe keinen Weg, um das Ziel zu ändern, ohne die Verknüpfung neu zu erstellen.
. Hinweis: Bitte Code zu verwenden, müssen Sie fügen Windows Script Host-Objektmodell COM zu den Projektreferenzen
Ändern der Zielpfad mit Shell32
Hier ist der Code-Schnipsel, die das Ziel einer Verknüpfung ändert, ohne zu entfernen und neu zu erstellen:
public void ChangeLinkTarget(string shortcutFullPath, string newTarget)
{
// Load the shortcut.
Shell32.Shell shell = new Shell32.Shell();
Shell32.Folder folder = shell.NameSpace(Path.GetDirectoryName(shortcutFullPath));
Shell32.FolderItem folderItem = folder.Items().Item(Path.GetFileName(shortcutFullPath));
Shell32.ShellLinkObject currentLink = (Shell32.ShellLinkObject)folderItem.GetLink;
// Assign the new path here. This value is not read-only.
currentLink.Path = newTarget;
// Save the link to commit the changes.
currentLink.Save();
}
Das zweite ist wahrscheinlich das, was Sie brauchen.
Hinweis: Leider sind die Schnipsel in C #, da ich nicht weiß, C ++ / CLI. Wenn jemand will diesen Schnipsel für C ++ / CLI neu zu schreiben, können Sie meine Antwort zu bearbeiten.