使用OLE剪贴板和经典剪贴板的意外/奇怪结果,还是我错过了什么?

时间:2012-09-20 04:49:40

标签: c++ windows winapi clipboard ole

我正在尝试以下技巧:

  1. 我已将IDataObject*设置到剪贴板中,因此我正在使用OleSetClipboard()将其设置到剪贴板中。
  2. 我有另一个CLIPFORMAT我想要添加到剪贴板,但我无法使用OleSetClipboard()执行此操作,因为我收到的IDataObject*未实现SetData()方法。因此,为了克服此限制,OpenClipboard()GetClipboardOwner()一起,我可以SetClipboardData()先将EmptyClipboard()添加到剪贴板而不是OleGetClipboard()
  3. 现在,一切正常,但会发生的事情是SetClipboardData()没有使用GetClipboardData()返回我放在剪贴板中的数据,但我可以使用IDataObject*

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

    有谁知道如何克服这个问题?还是另外一招?甚至解释为什么它这样工作?感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

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