拖放动态创建的快捷方式

Posted

技术标签:

【中文标题】拖放动态创建的快捷方式【英文标题】:Drag & drop of a dynamically created shortcut 【发布时间】:2010-12-28 12:00:25 【问题描述】:

我有一个 C# 应用程序,它创建快捷方式来启动具有特定参数和初始目录的其他程序。我希望用户能够从 Windows 窗体中拖动快捷方式并将其拖放到任何相关的位置,例如桌面、开始菜单等,但我真的不知道如何处理,谁能指出我方向对吗?

我已经看到一些使用 PInvoke 和 IShellLink 的示例,例如 this one,或者阅读 SO 上的答案,例如 here,这已经有助于创建快捷方式并将它们保存在 .lnk 文件中。我假设当用户启动拖动操作时,我必须在 DoDragDrop() 调用中交出数据,例如通过处理 MouseDown 信号。据我所知,我想我需要确切地知道目标期望接受丢弃的类型,以及如何序列化快捷方式,但找不到关于该部分的任何信息。

也许另一种选择是获取放置的位置,并从我的应用程序中管理它,但我还是有点不知道如何做到这一点。

框架版本目前是3.5,我只考虑Windows平台。

提前感谢您的帮助!


更新/解决方案:

使用上面提到的ShellLink code创建一个临时快捷文件,我只是简单地使用DataObject进行拖放,如下例所示:

private void picShortcut_MouseDown(object sender, MouseEventArgs e)

    ShellLink link = new ShellLink();

    // Creates the shortcut:
    link.Target = txtTarget.Text;
    link.Arguments = txtArguments.Text;
    link.Description = txtDescription.Text;
    link.IconPath = txtIconFile.Text;
    link.IconIndex = (txtIconIndex.Text.Length > 0 ?
        System.Int32.Parse(txtIconIndex.Text) : 0);
    link.Save("tmp.lnk");

    // Starts the drag-and-drop operation:
    DataObject shortcut = new DataObject();
    StringCollection files = new StringCollection();
    files.Add(Path.GetFullPath("tmp.lnk"));
    shortcut.SetFileDropList(files);
    picShortcut.DoDragDrop(shortcut, DragDropEffects.Copy);

如果您考虑 PInvoke 代码(此处未显示),则相当复杂,我仍然需要使用目标名称创建这个临时文件。如果有人知道...呃,捷径,欢迎!也许通过移植John Knoeller 提供链接的代码(谢谢!)。

【问题讨论】:

【参考方案1】:

Raymond Chen 在他的博客上写了一篇关于这个主题的整篇文章,查看dragging a virtual file

【讨论】:

有趣的文章。它提到了 IDataObject 接口,在我自己搜索了一下之后,我找到了一种从临时文件中拖放快捷方式的方法,无论如何我都必须创建它。 该链接返回 404 未找到网站【参考方案2】:

我在上一个帖子中回答了一个与此类似的问题。这可能是您的起点。

Drag and Drop link

【讨论】:

谢谢,但不是要处理放置部分并从那里创建快捷方式吗?我正在寻找另一部分。 IWshShortcut 类型似乎不被资源管理器接受,所以我什至不能以临时名称保存我的快捷方式并将其传递给 DoDragDrop() 方法,但也许我错过了什么?

以上是关于拖放动态创建的快捷方式的主要内容,如果未能解决你的问题,请参考以下文章

快捷方式:将一个项目移动到积压的顶部

如何把桌面图标快捷方式做成动态的

将 Windows 桌面快捷方式拖放到 listView

桌面快捷方式如何创建 如何创建桌面快捷方式

桌面快捷方式如何创建

快捷方式图标怎么创建 快捷方式图标的创建方法