Clipboard

Тема в разделе "WASM.BEGINNERS", создана пользователем SnugForce, 29 мар 2006.

  1. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Столкнулся с проблемой как определить формат данных помещенных в буфер обмена. Перечислить форматы в каком можно извлечь я разобрался. К примеру копирую из браузера часть странички, перечисляю форматы - их там куча, а вот как узнать в каком формате были помещены данные....

    Помещаются же данный

    HANDLE SetClipboardData(

    UINT uFormat, // clipboard format

    HANDLE hMem // data handle

    );

    а брать?

    Нужно, что слить данные с буфера при его изменении...
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "в каком формате были помещены данные...."

    Форматы перечисляются в порядке их помещения в буфер, поэтому бери первый формат, не считая служебных типа CF_LOCALE



    > "а брать ?"

    А брать соответсвенно GetClipboardData ;)

    Если нужно, чтобы винда извещала об изменении буфера, то нужно зарегистрировать свое окно просмотра SetClipboardViewer - подробности ес-но в MSDN :)
     
  3. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    leo

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

    А какие еще системные форматы есть?

    Вот мой код, на паскале, но думаю API там никто не отменял...
    Код (Text):
    1.  
    2. var
    3.   i:Integer;
    4.   hMem: Cardinal;
    5.   iSize: Integer;
    6.   pBuf: pointer;
    7.   iFormats, Index: Integer;
    8.   Format: Cardinal;
    9.   NameFormat: PChar;
    10. begin
    11.   SendMessage(FClipboardOwner, WM_DRAWCLIPBOARD, 0, 0);
    12.   Msg.Result := 0;
    13.  
    14.   OpenClipboard(ClipboardViewerForm.Handle);
    15.   Index := CountClipboardFormats();
    16.   Format := EnumClipboardFormats(0);
    17.   while Index > 0 do
    18.   begin
    19.    if IsClipboardFormatAvailable(Format) then
    20.    begin
    21.     SetLength(masClipBuf, length(masClipBuf) + 1);
    22.     ShowMessage(IntToStr(length(masClipBuf)));
    23.     masClipBuf[length(masClipBuf) - 1].CF_TYPE := Format;
    24.     hMem := GetClipboardData(masClipBuf[length(masClipBuf) - 1].CF_TYPE);
    25.  
    26.     GetMem(NameFormat, 100);
    27.     ZeroMemory(NameFormat, 100);
    28.     if GetClipboardFormatName(Format, NameFormat, 100) > 0 then
    29.       MessageBox(0, NameFormat, '', 0);
    30.  
    31.     ClipboardViewerForm.ListBox1.Items.Add(NameFormat);
    32.     pBuf := GlobalLock(hMem);
    33.     iSize := GlobalSize(hMem);
    34.     GetMem(masClipBuf[length(masClipBuf) - 1].pBuf, iSize);
    35.     CopyMemory(masClipBuf[length(masClipBuf) - 1].pBuf, pBuf, iSize);
    36.     GlobalUnlock(hMem);
    37.    end;
    38.    Dec(Index);
    39.    Format := EnumClipboardFormats(Format);
    40.   end;
    41.   CloseClipboard;
    42. end;
    43.  
     
  4. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Короче получается, что для НЕ_текста данные дулируются.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Для текста тоже дублируются - 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
     
  6. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    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 вроде его тоже резать...
     
  7. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Еще один вопрос:

    HTML Format Type: 49334 Size: 26223

    Rich Text Format Type: 49358 Size: 125186

    Какой формат лучше хранить? и если в хтмл картинка будет сохранена?
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SnugForce

    Ты описания API-функций внимательно читаешь ?

    Имя формату присваивается для идентификации пользовательских форматов. Предопределенные форматы CF_XXX считаются известными, никакого имени у них нет и GetClipboardFormatName для них возвращает 0. Поэтому все твои неизвестные форматы это есть обычный текст в разных кодировках: size = 4 это CF_LOCALE, два формата одинакового размера это CF_TEXT и CF_OEMTEXT, а тот что в 2 раза больше - CF_UNICODETEXT



    А насчет того, какой формат лучше хранить и в каком сохраняются картинки - ничего сказать не могу, сам поэкспериментируй ;)
     
  9. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    leo

    Ок, спасибо!!! Буду ставить опыты ))