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

Delphi 如何将任意数据作为文件复制到剪贴板?,delphi,clipboard,Delphi,Clipboard,我们开发了一个数据库应用程序。用户要求提供一个新功能:将blob复制到剪贴板中,以便Windows资源管理器可以将其粘贴为新文件。一种解决方案是将blob保存到临时文件夹中,并将这些临时文件添加到剪贴板 但我正在寻找更好的解决方案。是否可以在Windows资源管理器中挂起粘贴操作,并自己将blob保存到目标路径?我已经有一段时间没有尝试复制/粘贴了,但我非常确定您可以按照建议执行(将blob作为新文件插入剪贴板) 我似乎记得,根据您添加到剪贴板的方式,您可以指定要复制的数据类型。我认为,如果您正

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


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

我已经有一段时间没有尝试复制/粘贴了,但我非常确定您可以按照建议执行(将blob作为新文件插入剪贴板)

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

如果有机会的话,今晚我会尝试挖掘更多的细节(我的书签不是都放在这里)

[编辑]看一看。这就是我一直在使用的,它给出了一些关于数据类型的提示

你在写什么?德尔菲


[Edit2]我认为这实际上可能是Windows(?)的一个限制。它可能只是wxWidgets文档,但有很多。如果是这种情况,您必须首先使用您最初的创建临时文件的建议:-(

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

您需要为Windows资源管理器提供剪贴板格式,以便它可以粘贴文件。建议使用CF_HDROP。使用此剪贴板格式,您可以提供源文件名的列表,但文件当然需要存在,因此您需要将其保存到光盘


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

我从未尝试过,但我认为确实有可能。请查看MSDN文档,了解。
CFSTR\u FILECONTENTS
CFSTR\u FILEDESCRIPTOR
是您可能需要处理的格式

此外,我在CodeProject上找到了一篇文章,其中提供了一个演示程序:

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

来自MSDN文章

  • 现有文件应采用CF_HDROP格式提供
  • 使用CFSTR\u FILECONTENTS/CFSTR\u FILEDESCRIPTOR提供类似文件的数据 这种方法允许 目标从数据源创建文件 不需要知道的对象 关于底层数据的任何信息 储存。你通常应该在场 将数据转换为IStream接口 数据传输机制更加复杂 比全局内存对象更灵活 并且使用更少的内存
可以从MSDN中阅读的另外两篇好文章是:

当我第一次开始使用剪贴板传输文件时,我把这三篇文章都打印了出来,并且读了好几遍

处理接口可能非常复杂。我已经找到了两个很好的库来帮助解决这个问题

如果你在主页上向下滚动,你会看到一些常见问题很好的阅读。还有很多下载的示例应用程序。我认为AsyncSource演示应该对你所寻找的有所帮助。该套件是源代码免费软件。代码似乎有很好的注释


我目前正在使用来自Quasidata的组件。它不是免费的,但非常便宜。我最初使用Transfer@Once因为当时它比拖放组件套件得到了更好的支持。然而,这种情况已经发生了逆转。Transfer@Once还不支持Delphi 2009。当我开始移动我的应用程序时n我可能会切换组件Transfer@Once购买时包含代码。我个人觉得拖放代码更容易阅读和理解。

也谢谢你。每天学习新东西!