Получение данных буфера обмена в необработанном формате в С++

Я играл с буфером обмена Windows. Я заметил, что вы можете просматривать буфер обмена только в том случае, если вы укажете формат. Я видел программы, которые могут выгружать необработанное содержимое буфера обмена. Посмотрите на http://www.autohotkey.com/docs/misc/Clipboard.htm#ClipboardAll для примера того, что я имею в виду.

Есть ли способ сделать что-то подобное, я хочу сделать резервную копию буфера обмена, манипулировать им, а затем восстановить его, когда моя программа будет завершена.

Я ищу решение, отличное от .net, если это действительно так.

РЕДАКТИРОВАТЬ:

Я пробовал это до сих пор:

struct clipData {
 vector<void*> data;
 vector<int> size;
};

struct clipData saveClipboard(int &size) {
 clipData ret;
 UINT currentFormat = 0;
 HGLOBAL hData;
 if (OpenClipboard(0)) {

  while(currentFormat = EnumClipboardFormats(currentFormat)) {
   hData = GetClipboardData(currentFormat);
   int currentClipboardFormatSize = GlobalSize(hData); //Only works with text formats. Help!
   char *savedClipboardData = new char[currentClipboardFormatSize];
   char *ptrToData = (char*) GlobalLock(hData);
   memcpy(savedClipboardData, ptrToData, currentClipboardFormatSize);
   ret.data.push_back(savedClipboardData);
   ret.size.push_back(currentClipboardFormatSize);
   }
  CloseClipboard();
 }
 return ret;
}

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


person qwertymk    schedule 09.01.2011    source источник


Ответы (2)


Там нет «сырых» данных. Просто перечислите все форматы, находящиеся в данный момент в буфере обмена, выберите и сохраните содержание каждого формата. Но будьте осторожны с автоматическим преобразованием формата.

Если вы внимательно прочитаете документацию по autohotkey, на которую вы ссылаетесь, она даже сообщает вам, что она извлекает каждый формат отдельно и что она может успешно получить только подмножество форматов.

person Ben Voigt    schedule 09.01.2011
comment
@Dave18Dave18 Я вставил то, что пробовал до сих пор, и это моя главная проблема - person qwertymk; 09.01.2011
comment
Процедура зависит от формата, см. Стандартные форматы буфера обмена. Все зарегистрированные форматы и частные форматы в диапазоне (от CF_GDIOBJFIRST до CF_GDIOBJLAST) используют GlobalAlloc, поэтому ваши вызовы GlobalSize и GlobalLock будут работать для них нормально (но вызовы GlobalLock совмещайте с GlobalUnlock). - person Ben Voigt; 09.01.2011
comment
Будьте осторожны с такими форматами, как CF_BITMAP, CF_ENHMETAFILE и CF_HDROP — с ними объект в буфере обмена имеет формат HBITMAP, HENHMETAFILE или HDROP, не HGLOBAL! - person Adam Rosenfield; 09.01.2011
comment
@qertymk EnumClipboardFormats возвращает вам currentFormat, поэтому вам нужно проверить, есть ли у вас данные в CF_TEXT (текстовый формат), прежде чем читать их. Ссылка, которую я предоставил, содержит пример просмотра буфера обмена. - person cpx; 09.01.2011
comment
@Dave18: К сожалению, этот образец обрабатывает почти все форматы, запрашивая у владельца буфера обмена данные для отображения данных, на самом деле он не обрабатывает контент напрямую, за исключением пары конкретных форматов. - person Ben Voigt; 09.01.2011
comment
Хорошо, попробую, отпишусь, если возникнут проблемы, спасибо за помощь. - person qwertymk; 09.01.2011

MSDN содержит все необходимые примеры. знать, как манипулировать данными буфера обмена с помощью API буфера обмена.

person cpx    schedule 09.01.2011