如何将任意数据作为文件复制到剪贴板?

时间:2009-04-16 11:58:28

标签: delphi clipboard

我们开发了一个数据库应用程序。用户要求新功能:将blob复制到剪贴板,以便Windows资源管理器可以将它们粘贴为新文件。一种解决方案是将blob保存到临时文件夹中,并将这些临时文件添加到剪贴板。

但我正在寻找更好的解决方案。是否可以在Windows资源管理器中挂钩粘贴操作并将blob保存到目标路径?

4 个答案:

答案 0 :(得分:13)

我从未尝试过,但我认为这确实是可能的。请查看Shell Clipboard Formats的MSDN文档。 CFSTR_FILECONTENTSCFSTR_FILEDESCRIPTOR是您可能应该处理的格式。

此外,我在Code Project上发现了一篇提供演示程序的文章:How to drag a virtual file from your app into Windows Explorer

更新:用.NET编写的示例:

答案 1 :(得分:7)

来自MSDN文章Handling Shell Data Transfer Scenarios

  
      
  • 现有文件应以CF_HDROP格式提供。
  •   
  • 使用CFSTR_FILECONTENTS / CFSTR_FILEDESCRIPTOR提供类似文件的数据   格式。这种方法允许   目标是从数据创建文件   对象无需知道   有关基础数据的任何信息   存储。你通常应该出席   数据作为IStream接口。这个   数据传输机制更多   比全局内存对象更灵活   并且使用的内存要少得多。
  •   

从MSDN中读取的另外两篇好文章是:

当我第一次开始使用剪贴板传输文件时,我打印了所有三篇文章并多次阅读。

处理界面可能非常复杂。我找到了两个好的库来帮助解决这个问题。

The Drag and Drop Component Suite for Delphi。如果您在主页上向下滚动,您会看到一些常见问题解答很好。下载时还有很多示例应用程序。我认为AsyncSource演示应该对您正在寻找的内容有所帮助。该套房是免费软件源。该代码似乎得到了很好的评论。

我目前正在使用Quasidata的Transfer@Once组件。它不是免费的,但非常便宜。我最初使用的是Transfer @ Once,因为当时它比Drag and Drop组件套件更受支持。但是,这种情况已经逆转。 Transfer @ Once还不支持Delphi 2009.当我开始移动我的应用程序时,我可能会切换组件。购买时附带Transfer @ Once代码。就个人而言,我发现拖放代码更容易阅读和遵循。

答案 2 :(得分:5)

我会说explorer会自行复制到目标文件,因此无法直接写入目标文件。这是有道理的,因为源文件的名称只能来自将数据复制到剪贴板的应用程序,而不必是资源管理器。 OTOH目标文件的名称实际上可能不同,因为同名文件可能已经存在于目标文件夹中,并且只有资源管理器可以为目标文件创建修改后的名称(例如通过添加“副本”或附加“( 2)“到基本文件名。”

您需要为Windows资源管理器提供剪贴板格式,以便它可以粘贴文件。 documentation of standard clipboard formats表明 CF_HDROP 是正确的。使用此剪贴板格式,您将提供源文件名列表,但文件确实需要存在,因此您需要将它们保存到光盘。

尽管如此,你可以尝试使这个过程尽可能轻。通常当用户将数据复制到剪贴板时,它会立即放在那里,无论它是否用于粘贴操作。对于您的应用程序,这意味着您每次都需要创建文件并将文件名列表放入剪贴板。但是,Windows确实支持名为Delayed Rendering的模式,该模式完全用于此类情况。基本上,您只将数据的空存根放在剪贴板上,并且只有当另一个应用程序尝试访问数据时,才会从您的应用程序请求它。因此,您可以通过以下方式实现此操作:仅当用户尝试将文件粘贴到资源管理器中时,您才会将它们保存到光盘并返回文件名列表。

答案 3 :(得分:1)

我玩复制/粘贴已经有一段时间了,但我很确定你可以做你想要的事情(将blob作为新文件插入剪贴板)。

我似乎记得,根据您添加到剪贴板的方式,您可以指定要复制的数据类型。我认为如果你正确地获得了这种数据类型,你就可以像从Windows资源管理器中复制一样进行粘贴。

如果我有机会,我今天晚上会尝试挖掘更多细节(我的工作中没有我的书签)......

[编辑] 查看the wxWidgets documentation on drag and drop。这就是我一直在使用的内容,它提供了一些关于数据类型的提示。

你正在写什么? Delphi的?

[Edit2] 我认为这实际上可能是Windows的限制(?)。它可能只是wxWidgets文档,但有a suggestion that you only copy filenames rather than the files themselves。如果是这种情况,你将不得不首先提出创建临时文件的原始建议: - (