Как мне программно менять .lnk, чтобы изменить свою цель?
-
26-09-2019 - |
Вопрос
Есть ли способ открыть ярлык Windows (файл .lnk) и изменить его цель? Я нашел следующий фрагмент, который позволяет мне найти текущую цель, но это только для чтения:
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;
Я не могу найти ничего, чтобы изменить цель. Мой единственный вариант создать новый ярлык для перезаписания текущего? ... И если так, как мне это сделать?
Решение
Это не только для чтения, используйте LNK-> Path вместо, а затем LNK-> Save (). Предполагая, что у вас есть привилегии к файлу. C # код, который делает то же самое, в моем ответе в Эта тема.
Другие советы
Воссоздание ярлыка с WSH
Вы можете удалить существующий ярлык и создать новый с новой целью. Чтобы создать новый, вы можете использовать следующий фрагмент:
public void CreateLink(string shortcutFullPath, string target)
{
WshShell wshShell = new WshShell();
IWshRuntimeLibrary.IWshShortcut newShortcut = (IWshRuntimeLibrary.IWshShortcut)wshShell.CreateShortcut(shortcutFullPath);
newShortcut.TargetPath = target;
newShortcut.Save();
}
На данный момент я не вижу способа изменить цель, не воссоздавая ярлык.
Примечание: использовать фрагмент, вы должны добавить Модель объекта хоста скрипта Windows COM к проектам ссылки.
Изменение целевого пути с Shell32
Вот фрагмент, который меняет цель ярлыка без удаления и воссоздания:
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();
}
Второй, вероятно, что вам нужно.
Примечание: Извините, фрагменты находятся в C #, так как я не знаю C ++ / CLI. Если кто-то хочет переписать эти фрагменты для C ++ / CLI, не стесняйтесь редактировать мой ответ.