gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:38:24 27 4
gpt4 key购买 nike

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

  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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com