Столкнулся с проблемой как определить формат данных помещенных в буфер обмена. Перечислить форматы в каком можно извлечь я разобрался. К примеру копирую из браузера часть странички, перечисляю форматы - их там куча, а вот как узнать в каком формате были помещены данные.... Помещаются же данный HANDLE SetClipboardData( UINT uFormat, // clipboard format HANDLE hMem // data handle ); а брать? Нужно, что слить данные с буфера при его изменении...
> "в каком формате были помещены данные...." Форматы перечисляются в порядке их помещения в буфер, поэтому бери первый формат, не считая служебных типа CF_LOCALE > "а брать ?" А брать соответсвенно GetClipboardData Если нужно, чтобы винда извещала об изменении буфера, то нужно зарегистрировать свое окно просмотра SetClipboardViewer - подробности ес-но в MSDN
leo Ну с регистрацией я уже разобрался, понял как ложить и брать данные. Но не понятно как из массива форматов данных, при перелопачивании цикла EnumClipboardFormats, догадываться о том в каком именно были данные положенны.. А какие еще системные форматы есть? Вот мой код, на паскале, но думаю API там никто не отменял... Код (Text): var i:Integer; hMem: Cardinal; iSize: Integer; pBuf: pointer; iFormats, Index: Integer; Format: Cardinal; NameFormat: PChar; begin SendMessage(FClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); Msg.Result := 0; OpenClipboard(ClipboardViewerForm.Handle); Index := CountClipboardFormats(); Format := EnumClipboardFormats(0); while Index > 0 do begin if IsClipboardFormatAvailable(Format) then begin SetLength(masClipBuf, length(masClipBuf) + 1); ShowMessage(IntToStr(length(masClipBuf))); masClipBuf[length(masClipBuf) - 1].CF_TYPE := Format; hMem := GetClipboardData(masClipBuf[length(masClipBuf) - 1].CF_TYPE); GetMem(NameFormat, 100); ZeroMemory(NameFormat, 100); if GetClipboardFormatName(Format, NameFormat, 100) > 0 then MessageBox(0, NameFormat, '', 0); ClipboardViewerForm.ListBox1.Items.Add(NameFormat); pBuf := GlobalLock(hMem); iSize := GlobalSize(hMem); GetMem(masClipBuf[length(masClipBuf) - 1].pBuf, iSize); CopyMemory(masClipBuf[length(masClipBuf) - 1].pBuf, pBuf, iSize); GlobalUnlock(hMem); end; Dec(Index); Format := EnumClipboardFormats(Format); end; CloseClipboard; end;
Для текста тоже дублируются - CF_TEXT, CF_OEMTEXT, CF_UNICODETEXT ... Я ж тебе толкую, что Enum перечисляет форматы в порядке их занесения в буфер и первый неслужебный формат и есть "родной". MS рекомендует помещать данные в буфер начиная с наиболее информативных и затем для совместимости, менее информативные. Для продвинутых приложений типа Word, Excel и т.п. их "родной" формат и является наиболее информативным. Но простые приложения ес-но тоже кладут данные в буфер в своем "родном" формате, вообще не заботясь о прочих, и уже потом заботливая винда добавляет за них всякие навороты. Например, если первым при Enum попадается CF_TEXT - значит прога работает с ANSI и значит скорее всего OEM с юникодом ей до лампочки и их добавила винда и они ес-но при перечислении идут после CF_TEXT, хотя юникод и более информативен. Все это описано в MSDN, в т.ч. и некоторые спецформаты и юзерские диапазоны. PS: 1) В твоем коде IsClipboardFormatAvailable никчему, т.к. перечисляемые форматы и есть Available 2) Cписок форматов выводит виндовый clipbrd.exe
leo с IsClipboardFormatAvailable вчера ночью понял, когда массив просматривал. Спасибо за уточнение! Вот пример для строки юникода из блокнота BRED3: Unknow format Size: 4 Unknow format Size: 64 Unknow format Size: 32 Unknow format Size: 32 Для хтмл с рисунком из mozilla: DataObject Size: 4 text/html Size: 3122 HTML Format Size: 1821 text/_moz_htmlcontext Size: 338 text/_moz_htmlinfo Size: 8 Unknow format Size: 154 Unknow format Size: 77 FileGroupDescriptor Size: 336 FileGroupDescriptorW Size: 596 FileContents Size: 47 UniformResourceLocator Size: 22 UniformResourceLocatorW Size: 44 Ole Private Data Size: 472 Unknow format Size: 4 Unknow format Size: 77 В первом примере форматы вообще не определенны (( Обычно первым выдает формат DataObject 49161 , я так понимаю его нужно исключать? CF_LOCALE это 16 вроде его тоже резать...
Еще один вопрос: HTML Format Type: 49334 Size: 26223 Rich Text Format Type: 49358 Size: 125186 Какой формат лучше хранить? и если в хтмл картинка будет сохранена?
SnugForce Ты описания API-функций внимательно читаешь ? Имя формату присваивается для идентификации пользовательских форматов. Предопределенные форматы CF_XXX считаются известными, никакого имени у них нет и GetClipboardFormatName для них возвращает 0. Поэтому все твои неизвестные форматы это есть обычный текст в разных кодировках: size = 4 это CF_LOCALE, два формата одинакового размера это CF_TEXT и CF_OEMTEXT, а тот что в 2 раза больше - CF_UNICODETEXT А насчет того, какой формат лучше хранить и в каком сохраняются картинки - ничего сказать не могу, сам поэкспериментируй