【问题标题】:How do I programmatically change a .lnk to change its target?如何以编程方式更改 .lnk 以更改其目标?
【发布时间】:2010-09-29 15:03:58
【问题描述】:

有什么方法可以打开 Windows 快捷方式(.lnk 文件)并更改它的目标?我找到了下面的 sn-p,它可以让我找到当前的目标,但它是一个只读属性:

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;

我找不到任何可以改变目标的东西。我唯一的选择是创建一个新的快捷方式来覆盖当前快捷方式吗? ..如果是这样,我该怎么做?

【问题讨论】:

    标签: .net c++-cli windows-xp-embedded shell32


    【解决方案1】:

    它不是只读的,使用 lnk->Path 代替,然后是 lnk->Save()。假设您对文件有写权限。我在this thread 中的回答中有做同样事情的 C# 代码。

    【讨论】:

    • 这对 C# 也很有效,但要访问 Shell32.Shell 类,我必须在我的项目中添加 C:\Windows\system32\shell32.dll 作为参考。
    • 这很好,但是如何使用它来只读受保护的文件?
    【解决方案2】:

    使用 WSH 重新创建快捷方式

    您可以删除现有快捷方式并使用新目标创建新快捷方式。要创建一个新的,您可以使用以下 sn -p:

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

    目前,我没有看到任何方法可以在不重新创建快捷方式的情况下更改目标。

    注意:要使用 sn-p,您必须将 Windows 脚本宿主对象模型 COM 添加到项目引用中。

    用 Shell32 改变目标路径

    这里的 sn-p 改变了快捷方式的目标,而不删除和重新创建它:

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

    第二个可能是你需要的。

    注意:抱歉,sn-ps 在 C# 中,因为我不懂 C++/CLI。如果有人想为 C++/CLI 重写这些 sn-ps,请随时编辑我的答案。

    【讨论】:

    • 查看here了解如何引用Shell32
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多