Существуют ли способы (или функции) для сохранения данных из HANDLE в файл без потери данных и загрузки данных из файла в HANDLE? Предполагая, что это HANDLE к данным, полученным из GetClipboardData.
Было бы здорово, если бы в форматах буфера обмена были ответы для всех возможных типов данных, но я бы в первую очередь искал CF_LOCALE, CF_TEXT, CF_OEMTEXT и CF_UNICODETEXT.
Я попытался преобразовать HANDLE в указатель, но не знаю, как правильно получить данные (поскольку дескриптор указывает только на первые данные без дополнительной информации)
Я попытался получить некоторую полезную информацию о дескрипторе, чтобы узнать, что, возможно, находится внутри, но я не могу ее получить.
Слишком мало попыток попробовать, так как очень немногие (или никто) не задавался этим вопросом...
learn.microsoft.com/en-us/windows/win32/api/winuser/…
Невозможно даже сохранить содержимое, очистить и перезаписать, а затем восстановить старое содержимое. Вы пытаетесь это сделать и добавляете сериализацию файлов сверху.





Нет готового решения для решения этой задачи. Вам придется делать все вручную.
Используйте EnumClipboardFormats() , чтобы узнать, какие форматы в настоящее время доступны в буфере обмена, и GetClipboardData(), чтобы получить доступ к данным каждого формата.
Затем вы можете вручную записать данные каждого формата в свой собственный файл по мере необходимости, а затем позже прочитать данные из вашего файла и поместить их обратно в буфер обмена в соответствии с каждым типом формата, используя SetClipboardData() или OleSetClipboard( ).
Форматы данных стандартных форматов буфера обмена задокументированы в MSDN:
Стандартные форматы буфера обмена
Форматы буфера обмена оболочки
Например, HANDLE для CF_LOCALE — это дескриптор HGLOBAL выделенного блока памяти, содержащего идентификатор LCID, тогда как HANDLE для CF_TEXT/CF_UNICODETEXT — это дескриптор HGLOBAL выделенного блока памяти, содержащего фактические текстовые символы ANSI/Unicode.
Если вы хотите сохранить/загрузить данные для нестандартных форматов буфера обмена, вы не сможете этого сделать, если у вас нет глубоких знаний о том, как их данные форматируются в памяти для хранения в буфере обмена.
Как правило, вы используете функцию
GlobalLock(), чтобы получить полезный указательvoid*изHANDLE. При этом вы должны немедленно скопировать/сохранить/любые указанные данные, а затем быстро вызватьGlobalUnlock(), чтобы снять блокировку с данных буфера обмена.