拖放动态创建的快捷方式

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

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

也许另一个选择是获取drop的位置,并从我的应用程序中管理它,但是我再次对如何做到这一点有点无能为力。

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

在此先感谢您的帮助!


更新/解决方案:

使用上面提到的ShellLink代码创建临时快捷方式文件,我只是使用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提供链接的代码(谢谢!)。

Raymond Chen在他的博客上做了一篇关于这个话题的整篇文章,检查了拖动虚拟文件

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

拖放链接