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

标签 c++ windows winapi clipboard ole

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

  1. 我要将 IDataObject* 设置到剪贴板中,所以我使用 OleSetClipboard() 将其设置到剪贴板中。
  2. 我有另一个 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/

相关文章:

windows - Github:为什么我需要它?

c++ - C++ 中的 PlaySound() 不起作用

c++ - RichEdit 的 EM_AUTOURLDETECT 消息可识别链接,但我无法单击它

c++ - 如何使用通用函数/插槽连接到 boost::signal?

c++ - Docker Centos,无法执行二进制文件

c++ - system() 有什么不好?

java - 为什么 Linux Java UI 比 Windows Java UI 大?

windows - timeBeginPeriod API 会影响系统时钟吗?

c++ - 运行 MEX 文件时 MATLAB 崩溃

C++ 函数参数或参数数组