2

我正在尝试执行以下技巧:

  1. 我必须IDataObject*被设置到剪贴板,所以我用OleSetClipboard()它来设置到剪贴板。
  2. 我有另一个CLIPFORMAT我想添加到剪贴板,但我不能这样做,OleSetClipboard()因为IDataObject*我收到的没有实现SetData()方法。因此,为了克服这个限制,我可以OpenClipboard()通过GetClipboardOwner()这种方式,SetClipboardData()无需EmptyClipboard()先到剪贴板。

现在,一切正常,但发生的情况是它OleGetClipboard()不会返回我使用 放在剪贴板中的数据SetClipboardData(),但我可以使用GetClipboardData().

我可以想象为什么会发生这种情况(它只是返回IDataObject*),所以我尝试OleFlushClipboard()删除IDataObject*, 并OleGetClipboard()再次让操作系统重建一个新的IDataObject*它仍然不包含CLIPFORMAT添加的by SetClipboardData()

有谁知道如何克服这个问题?还是不同的把戏?甚至解释为什么它会这样工作?谢谢

4

1 回答 1

1

我刚刚尝试过这个(在 Windows 7 上),它似乎可以工作,但只能跨进程:

  • 在与剪贴板所有者不同的过程中,OleGetClipboard 返回一个包含所有格式的数据对象(即来自数据对象的原始格式和添加到剪贴板的额外格式)。
  • 在同一过程中,OleGetClipboard 始终返回一个不包含额外剪贴板格式的数据对象。

在这两种情况下,调用 OleFlushClipboard 没有任何区别。

无论如何,这似乎不是一个非常强大的解决方案。相反,您可以创建自己的数据对象,该对象响应它所知道的格式并将其他格式委托给原始数据对象。EnumFormatEtc 方法将组合来自两个对象的格式,依此类推。 本文有一个您可以扩展的简单数据对象的骨架。

于 2012-09-20T09:27:47.830 回答