Top.Mail.Ru
Ответы

Как можно посмотреть структуру и повторить скопированный в буфер обмена объект десктопной программы на windows

Например в любой графической программе можно скопировать предположим фигуру круг и там же ее потом вставить.

А как я могу создать такой круг извне - например в блокноте или еще где-то?
Или как помотреть структуру того, что содержится в буфере обмена при копировании какого-либо объекта десктопной программы?

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок

Есть такая штука как API операционной системы.
Вот этот самый API и реализует работу с буфером обмена.

В случае виндовз это реализуется в winuser.h который в ходит в состав windows.h
Если эти библиотеки подключены то можно дергать за API.
Сначала нужно завладеть ресурсом операционной системы "буфер обмена" вызвав функцию OpenClipboard () она должна вернуть хендл на захватываемый ресурс системы.
после этого можно запрашивать системное апи о поддерживаемом формате данных в буфере обмена вызовом функции "IsClipboardFormatAvailable( АйДИ_типа_данных )".
Если данные нужного типа то можно вызывать GetClipboardData ().
После этого нужно освободить опщий ресурс системы вызовам апи функции CloseClipboard ().
Список стандартных форматов буфера обмена есть в документации https://learn.microsoft.com/ru-ru/windows/win32/dataxchg/standard-clipboard-formats

Данные в буфере могут одновременно храницо в нескольких форматах одновременно что можно проверить с помощью IsClipboardFormatAvailable (...).
Любое приложение может создавать собственный формат данных в буфере обмена главное что бы принимающие приложение умело работать с таким форматом данных.

Аватар пользователя
Мастер

Попроси ChatGpt !

Аватар пользователя
Гений

Структуру записей в буфере - через утилиту InsideClipboard

> в любой графической программе можно скопировать предположим фигуру круг и там же ее потом вставить.
Этот самый круг может быть либо пиксельным изображением, либо векторным объектом. Если с изображением все просто, то векторный объект - это OLE-объект с интерфейсом IDataObject, а вот все остальное у него специфичное для конкретной программы и расковырять такой объект без документации, чтобы он потом вставлялся в эту прогу - задача нетривиальная.
https://learn.microsoft.com/en-us/dotnet/api/system.windows.idataobject?view=windowsdesktop-8.0

>например в блокноте
в блокноте можно создать только строки текста, а возможное содержимое буфера обмена текстом не ограничивается.

Из питона можно работать с буфером через pyperclip или другие библиотеки. Ну и нужно уметь работать из того же питона с OLE/COM/COM+

Аватар пользователя
Знаток

win + v