我们开发数据库应用程序.用户要求新功能:将blob复制到剪贴板,以便Windows资源管理器可以将它们粘贴为新文件.一种解决方案是将blob保存到临时文件夹中,并将这些临时文件添加到剪贴板.
但我正在寻找更好的解决方案.是否可以在Windows资源管理器中挂钩粘贴操作并自行将blob保存到目标路径?
Rôm*_*con 13
我从未尝试过,但我认为这确实是可能的.请查看Shell剪贴板格式的MSDN文档.CFSTR_FILECONTENTS并且CFSTR_FILEDESCRIPTOR是您可能应该处理的格式.
另外,我在Code Project上发现了一篇提供演示程序的文章:如何将虚拟文件从应用程序拖到Windows资源管理器中.
更新:用.NET编写的示例:
从MSDN文章处理Shell数据传输方案
- 应以CF_HDROP格式提供现有文件.
- 使用CFSTR_FILECONTENTS/CFSTR_FILEDESCRIPTOR格式提供类文件数据.此方法允许目标从数据对象创建文件,而无需了解有关基础数据存储的任何信息.您通常应将数据显示为IStream接口.此数据传输机制比全局内存对象更灵活,并且使用更少的内存.
从MSDN中读取的另外两篇好文章是:
当我第一次开始使用剪贴板传输文件时,我打印了所有三篇文章并多次阅读.
处理接口可能非常复杂.我找到了两个好的库来帮助解决这个问题.
该拖放组件套件德尔福.如果您在主页上向下滚动,您会看到一些常见问题解答很好.下载时还有很多示例应用程序.我认为AsyncSource演示应该对您正在寻找的内容有所帮助.该套房是免费软件源.代码似乎评论很好.
我目前正在使用Quasidata 的Transfer @ Once组件.它不是免费的,但非常便宜.我最初使用的是Transfer @ Once,因为当时它比Drag and Drop组件套件更受支持.但是,这种情况已经逆转.Transfer @ Once还不支持Delphi 2009.当我开始移动我的应用程序时,我可能会切换组件.购买时附带Transfer @ Once代码.就个人而言,我发现拖放代码更容易阅读和遵循.
我会说explorer会复制到目标文件本身,因此无法直接写入目标文件.这是有道理的,因为源文件的名称只能来自将数据复制到剪贴板的应用程序,而不必是资源管理器.OTOH目标文件的名称实际上可能不同,因为同名文件可能已经存在于目标文件夹中,并且只有资源管理器可以为目标文件创建修改后的名称(例如通过添加"副本"或附加"( 2)"到基本文件名".
您需要为Windows资源管理器提供剪贴板格式,以便它可以粘贴文件.标准剪贴板格式的文档表明CF_HDROP是正确的.有了这个剪贴板格式,你会提供源文件名列表,但这些文件确实需要存在,当然,这样你将需要将它们保存到光盘上.
不过,您可以尝试使该过程尽可能轻.通常当用户将数据复制到剪贴板时,它会立即放在那里,无论它是否用于粘贴操作.对于您的应用程序,这意味着您每次都需要创建文件并将文件名列表放入剪贴板.但是,Windows确实支持一种称为延迟渲染的模式,该模式完全用于此类情况.基本上,您只将数据的空存根放在剪贴板上,并且只有当另一个应用程序尝试访问数据时,才会从您的应用程序请求它.因此,您可以通过以下方式实现此操作:仅当用户尝试将文件粘贴到资源管理器中时,您才会将它们保存到光盘并返回文件名列表.