【问题标题】:Unexpected/weird results using OLE clipboard and classic clipboard, or do I miss something?使用 OLE 剪贴板和经典剪贴板的意外/奇怪结果,还是我错过了什么?
【发布时间】:2012-09-20 04:49:39
【问题描述】:

我正在尝试做以下技巧:

  1. 我将IDataObject* 设置到剪贴板中,所以我使用OleSetClipboard() 将其设置到剪贴板中。
  2. 我有另一个CLIPFORMAT 我想添加到剪贴板,但我不能用OleSetClipboard() 来做,因为我收到的IDataObject* 没有实现SetData() 方法。所以,为了克服这个限制我OpenClipboard()GetClipboardOwner(),这样,我可以在没有EmptyClipboard() 的情况下先将SetClipboardData() 到剪贴板。

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

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

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

【问题讨论】:

    标签: c++ windows winapi clipboard ole


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好主意:-)。我早该想到的!猜猜有时您只需要退后一步……但是您知道为什么会这样吗?我找不到任何可能暗示他在刷新之前持有的类型的过程的额外数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多