Question

Est-il possible d'ouvrir un raccourci Windows (fichier .lnk) et changer la cible de ce? J'ai trouvé l'extrait suivant qui me permet de trouver la cible actuelle, mais il est une propriété en lecture seule:

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;

Je ne peux pas trouver quoi que ce soit de modifier la cible. Est ma seule option pour créer un nouveau raccourci pour remplacer l'actuel? ..et si oui, comment puis-je faire?

Était-ce utile?

La solution

Il est pas en lecture seule, utilisez lnk-> Chemin place, suivi par lnk-> Save (). En supposant que vous disposez des droits d'écriture dans le fichier. C # code qui fait la même chose est dans ma réponse dans ce fil .

Autres conseils

Recréer un raccourci avec WSH

Vous pouvez supprimer un raccourci existant et de créer une nouvelle avec la nouvelle cible. Pour créer un nouveau, vous pouvez utiliser l'extrait suivant:

public void CreateLink(string shortcutFullPath, string target)
{
    WshShell wshShell = new WshShell();
    IWshRuntimeLibrary.IWshShortcut newShortcut = (IWshRuntimeLibrary.IWshShortcut)wshShell.CreateShortcut(shortcutFullPath);
    newShortcut.TargetPath = target;
    newShortcut.Save();
}

Pour l'instant, je ne vois aucun moyen de changer la cible sans recréer le raccourci.

Note:. Utiliser l'extrait, vous devez ajouter Windows Script modèle d'objet hôte COM aux références du projet

Modification du chemin cible avec Shell32

Voici l'extrait qui change la cible d'un raccourci sans enlever et de le recréer:

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();
}

Le second est probablement ce que vous avez besoin.

Note: Désolé, les extraits sont en C # depuis que je ne sais pas C ++ / CLI. Si quelqu'un veut réécrire ces extraits pour C ++ / CLI, vous pouvez modifier ma réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top