Я пытаюсь сделать следующий трюк:
IDataObject*
чтобы быть установлен в буфер обмена, поэтому я использую OleSetClipboard()
чтобы установить его в буфер обмена.CLIPFORMAT
Я хочу добавить в буфер обмена, но я не могу сделать это с OleSetClipboard()
поскольку IDataObject*
Я получаю не реализует SetData()
метод. Итак, чтобы преодолеть это ограничение я OpenClipboard()
с GetClipboardOwner()
таким образом, я могу SetClipboardData()
в буфер обмена без EmptyClipboard()
первый.Теперь все работает хорошо, но что происходит, так это OleGetClipboard()
не возвращает данные, которые я поместил в буфер обмена, используя SetClipboardData()
, но я могу использовать GetClipboardData()
,
Я могу себе представить, почему это происходит (он просто возвращает IDataObject*
), поэтому я пытался OleFlushClipboard()
удалить IDataObject*
, а также OleGetClipboard()
снова, чтобы позволить ОС перестроить новый IDataObject*
, а также это все еще не содержало CLIPFORMAT
Добавлено SetClipboardData()
,
У кого-нибудь есть идеи, как преодолеть эту проблему? или другой трюк? или вообще объяснить, почему так работает? Спасибо
Я только что попробовал это (на Windows 7), и это, кажется, работает, но только кросс-процесс:
В обоих случаях вызов OleFlushClipboard не имеет значения.
Во всяком случае, это не похоже на очень надежное решение. Вместо этого вы можете создать собственный объект данных, который отвечает на известные ему форматы, и делегировать другие форматы исходному объекту данных. Метод EnumFormatEtc будет объединять форматы обоих объектов и т. Д. Эта статья имеет скелет простого объекта данных, который вы можете расширить.
Других решений пока нет …