拖动;从Form下载到Windows;得到目的地

时间:2010-02-14 14:13:57

标签: vb.net file-io drag-and-drop

我一直在VB.NET中开发一个应用程序,它需要将一个控制对象(例如,一个ListViewItem)拖出表单,然后拖到用户指定的位置(例如,在桌面上,或者一个文件夹)。

但是,“ListViewItem”所代表的“复制”文件尚不存在。需要下载然后将其放在用户指定的位置。我能够获得目的地丢弃的路径/位置吗?然后我会继续下载该文件,然后将其放在指定用途的位置。

我已经查看了有关similar issue的其他问题,其中详细说明了表单外的拖动操作,它似乎没有办法确定快捷方式的去向或如何标记目标位置。

基本上,我认为它可能需要某种“动态链接”或“虚拟文件”,正如我在别处看到的那样。然后,在删除操作之后,以某种方式从我的应用程序访问此“链接”,继续下载文件并将其放在最终的放置目标中。

感谢任何帮助,提前谢谢!


观察:

Roger Lipscombe提供了一个链接,其中包含其他文章的链接,以及看似有希望的信息。 以下链接可能在实现拖放操作时非常有用,而无需提供托管代码中所需的确切数据。

3 个答案:

答案 0 :(得分:5)

通过在IDataObject :: GetData实现中响应CFSTR_PREFERREDDROPEFFECT,您可以要求Explorer将IDataObject :: GetData调用延迟到CFSTR_FILEDESCRIPTOR到实际发生丢弃的时间。有关示例,请参阅http://hg.mozilla.org/mozilla-central/file/b49a6a8a4973/widget/src/windows/nsDataObj.cpp。请注意,如果目标是虚拟文件夹,则放置目标没有义务遵守您的偏好。

资源管理器按照顺序检查文件名的剪贴板格式

  1. CF_HDROP

  2. CFSTR_FILEDESCRIPTOR / CFSTR_FILECONTENTS

  3. CFSTR_FILENAME

  4. 不要使用CF_HDROP,因为它要求源文件实际存在于文件系统的某个位置。请改用CFSTR_FILEDESCRIPTOR / CFSTR_FILECONTENTS。

答案 1 :(得分:2)

对不起,但是无法获得DnD操作的目标路径。因为掉落目标甚至可能没有路径!

有关更详细的说明,请参阅here

当然,您可以尝试挂钩到DnD,然后询问目标窗口,并从那里尝试找到目标路径,如果窗口是您已知的(例如,窗口属于资源管理器进程)。 / p>

答案 2 :(得分:2)

你真的想知道“文件”的删除位置吗?或者你只是不想提前提供数据?

如果是后者,Raymond Chen在本机代码中有一个完整的series on implementing virtual drag and drop。大卫安森translates it into managed codeadds asynchronous support