我有一个C#应用程序,可以创建快捷方式来启动具有特定参数和初始目录的其他程序。我希望用户能够从Windows窗体中拖动一个快捷方式并将其放在任何相关的位置,如桌面,开始菜单等,但我真的不知道如何处理它,任何人都可以指向我正确的方向?
我看过一些使用PInvoke和IShellLink this one的示例,或者阅读SO上的答案,例如here,它们已经帮助创建了快捷方式并将它们保存在.lnk文件中。我假设当用户启动拖动操作时,我必须在DoDragDrop()
调用中移交数据,例如通过处理MouseDown
信号。就我所知,我想我需要确切知道目标期望接受丢弃的类型,以及如何序列化快捷方式,但无法找到该部分的任何信息。
也许另一个选择是获取drop的位置,并从我的应用程序中管理它,但是我又有点无能为力。
框架版本目前是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给出链接的代码(谢谢!)。
答案 0 :(得分:4)
Raymond Chen在他的博客上发表了关于这个话题的整篇文章,请查看dragging a virtual file
答案 1 :(得分:1)
我在之前的帖子中回答了一个与此类似的问题。这可能是你的起点。