我正在尝试执行以下技巧:
- 我要将
IDataObject*
设置到剪贴板中,所以我使用OleSetClipboard()
将其设置到剪贴板中。 - 我有另一个
CLIPFORMAT
我想添加到剪贴板,但我不能用OleSetClipboard()
来做,因为IDataObject*
我收到的未实现SetData()
方法。所以,为了克服这个限制,我用GetClipboardOwner()
OpenClipboard()
,这样,我可以SetClipboardData()
到剪贴板而不用EmptyClipboard()
首先。
现在,一切正常,但 OleGetClipboard()
没有返回我使用 SetClipboardData()
放入剪贴板的数据,但我可以使用 GetClipboardData()
。
我可以想象为什么会发生这种情况(它只返回 IDataObject*
),所以我尝试通过 OleFlushClipboard()
删除 IDataObject*
和 OleGetClipboard()
再次让操作系统重建一个新的 IDataObject*
,它仍然没有包含 CLIPFORMAT
由 SetClipboardData()
添加。
有没有人知道如何解决这个问题?还是不同的把戏?甚至解释为什么它以这种方式工作?谢谢
最佳答案
我刚刚试过这个(在 Windows 7 上),它似乎可以工作,但只能跨进程:
- 在与剪贴板所有者不同的过程中,OleGetClipboard 返回一个包含所有格式的数据对象(即来自数据对象的原始格式和添加到剪贴板的额外格式)。
- 在同一个过程中,OleGetClipboard 总是返回一个不包含额外剪贴板格式的数据对象。
在这两种情况下,调用 OleFlushClipboard 都没有区别。
无论如何,这似乎不是一个非常可靠的解决方案。您可以做的是创建您自己的数据对象,以响应它所知道的格式并将其他格式委托(delegate)给原始数据对象。 EnumFormatEtc 方法将合并来自两个对象的格式,依此类推。 This article具有您可以扩展的简单数据对象的骨架。
关于c++ - 使用 OLE 剪贴板和经典剪贴板时出现意外/奇怪的结果,还是我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506217/