Неожиданные / странные результаты с использованием буфера обмена OLE и классического буфера обмена, или я что-то пропустил?

Я пытаюсь сделать следующий трюк:

  1. я имею IDataObject* чтобы быть установлен в буфер обмена, поэтому я использую OleSetClipboard() чтобы установить его в буфер обмена.
  2. у меня есть другой CLIPFORMAT Я хочу добавить в буфер обмена, но я не могу сделать это с OleSetClipboard() поскольку IDataObject* Я получаю не реализует SetData() метод. Итак, чтобы преодолеть это ограничение я OpenClipboard() с GetClipboardOwner()таким образом, я могу SetClipboardData() в буфер обмена без EmptyClipboard() первый.

Теперь все работает хорошо, но что происходит, так это OleGetClipboard() не возвращает данные, которые я поместил в буфер обмена, используя SetClipboardData(), но я могу использовать GetClipboardData(),

Я могу себе представить, почему это происходит (он просто возвращает IDataObject*), поэтому я пытался OleFlushClipboard() удалить IDataObject*, а также OleGetClipboard() снова, чтобы позволить ОС перестроить новый IDataObject*, а также это все еще не содержало CLIPFORMAT Добавлено SetClipboardData(),

У кого-нибудь есть идеи, как преодолеть эту проблему? или другой трюк? или вообще объяснить, почему так работает? Спасибо

2

Решение

Я только что попробовал это (на Windows 7), и это, кажется, работает, но только кросс-процесс:

  • В процессе, отличном от владельца буфера обмена, OleGetClipboard возвращает объект данных, который содержит все форматы (то есть исходные форматы из объекта данных и дополнительные, добавленные в буфер обмена).
  • В одном и том же процессе OleGetClipboard всегда возвращает объект данных, который не содержит дополнительные форматы буфера обмена.

В обоих случаях вызов OleFlushClipboard не имеет значения.

Во всяком случае, это не похоже на очень надежное решение. Вместо этого вы можете создать собственный объект данных, который отвечает на известные ему форматы, и делегировать другие форматы исходному объекту данных. Метод EnumFormatEtc будет объединять форматы обоих объектов и т. Д. Эта статья имеет скелет простого объекта данных, который вы можете расширить.

1

Другие решения

Других решений пока нет …