Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Вниз

Clipboard 


SuperBizon   (2002-02-15 11:32) [0]

Не подскажите, как перехватывать из моей программы сообщения(и какие) при копировании в буфер юзером каких-либо данных из любой другой программы? WM_COPY, WM_CUT почему-то не срабатывает. Заранее благодарен.



Digitman (M)   (2002-02-15 16:15) [1]

а почему они должны "срабатывать" ? это "свои" события, а не события "другой программы", к тому же генерируются они для EDIT- и COMBOBOX-контролов и только для формата CF_TEXT.

для полного же контроля за состоянием буфера обмена и за окнами, являющимися "владельцами" помещаемой в буфер инф-ции, следует обратиться к механизму "Clipboard Viewers". Сей механизм позволяет зарегистрировать свое окно в цепочке окон, с которой работает данный механизм, с целью обработки спец.сообщений о событиях в буфере обмена, посылаемых Windows во все окна в зарегистрированной цепочке.

См. Win32SDK help на одноименную тему



SuperBizon   (2002-02-15 17:31) [2]

Спасибо за совет, вроде частично разобрался. Делаю SetClipboardViewer, потом обрабатываю сообщение WM_DRAWCLIPBOARD. Но в SDK написано, что я вроде бы как должен после того как получил это сообщение послать его следующему в очереди "Clipboard Viewers". Также написано, что Handle следующего вьювера мне возвращает выше упомянутая "SetClipboardViewer". Но мне почему-то эта функция возвращает "0". Что я делаю неправильно? И чем мне грозит теоретически не отсылка этих сообщений следующему вьюверу? Заранее благодарен за ответ.



Digitman (M)   (2002-02-15 17:42) [3]

а ты попробуй перед своим процессом запустить, к примеру, штатное системное приложение (из Accessories). Ведь оно как раз и регистрирует минимум одно окно в этой цепочке ! то, что ты 0-й хэндл получаешь, может вполне говорить о том, что на момент вызова тобой SetClipboardViewer() ни одна задача не зарегистрировала в цепочке свое окно.
Чем грозит ? Тебе-то, видимо, как раз и ничем, а вот тот, кого ты "проигнорировал" таким образом, вроде бы как и не сможет при этом быть извещенным о событиях в буфере, интересующих конкретно его. Проверяй это опять же той же стандартной пр-мой "Буфер обмена". IMHO)



SuperBizon   (2002-02-15 17:59) [4]

Попробовал, даже запустил пару прог, которые точняк должны следить за буфером. Тот же результат, SetClipboardViewer возвращает "0" и всё тут тебе. И возник ещё один вопрос, после получения WM_DRAWCLIPBOARD, пытаюсь проверить формат данных, скопированных в буфер, смотрю при помощи HasFormat, всегда получаю одно и то-же - "5672", то есть выдаёт всегда одно и то-же, копирую я картинку(кусок или целую) или текст. Насколько я понимаю эта функция должна возвращать точно идентификатор типа, копируемой информации. Что не так?



Digitman (M)   (2002-02-15 18:39) [5]

1. >>"О" и все тут тебе.
Ну, так на то ж есть GetLastError() ! Ты почитай, что она тебе скажет, что не так в вызове. Ведь черным по белому в хэлпе написано :

Return Values

If the function succeeds, the return value identifies the next window in the clipboard viewer chain. If an error occurs or there are no other windows in the clipboard viewer chain, the return value is NULL. To get extended error information, call GetLastError.

Если уж и это трудно, просто помести вызов в "скобки" :
Win32Check(SetClipboardViewer <> 0), получишь готовое текст.сообщение о причине отказа, если он был.

2. >>всегда получаю одно и то-же - "5672"
А как ты, собственно, получаешь-то это значение ? Ведь тот же метод Clipboard.HasFormat() (коль уж ты решил его использовать, хотя лучше бы было прямой вызов API для этой цели задействовать) принимает параметром один из кодов форматов (стандартных либо нестандартных) и возвращает булев флаг, по анализу значения которого и принимается решение, содержит ли в дан.момент буфер данные интересующего формата (Result = True, если содержит, False - иначе). И это ведь тоже черным по белому в хэлпе к методу написано ! Неужели так трудно самостоятельно почитать и вникнуть в то, что написано ?



SuperBizon   (2002-02-15 19:46) [6]

Согласен, тормоз:) Но за ответы большое спасибо!



SuperBizon   (2002-02-18 17:22) [7]

Тут за время работы с Clipboard возник ещё один вопросец. Ответа пока не смог нигде найти:( Если я вижу, что формат, скопированной в буфер инф-ии, например, "CF_BITMAP". Могу я что-нибудь сделать с этим Bitmap, например, сохранить куда-нибудь? Заранее спасибо.



Digitman   (2002-02-18 18:38) [8]

Конечно, можешь)
Так же как и с любым другим форматом - разницы нет. Другой вопрос, что для станд.форматов ты волен воспользоваться существующими API/VCL-механизмами для чтения/интерпретации этих форматов, в то время как о чтении/интерпретации нестандартных форматов ты должен заботиться сам



SuperBizon   (2002-02-18 19:27) [9]

Короче, я вообще запутался:( На "WM_DRAWCLIPBOARD" смотрю "FormatCount" - возвращает 11. В любой другой момент форматов почему-то 4. В чём тут может быть дело? И про форматы...при копировании текста это у нас "CF_TEXT", при копировании куска картинки, например из MS Paint это "CF_BITMAP", а при копировании из проводника, например, файла с расширением ".BMP" при проверке на все "стандартные стандарты" он не подходит не под один из них. Прочитал всё в MSDN на эту тему, ни фига не нашёл:( Что не так делаю???



SuperBizon   (2002-02-18 19:55) [10]

Блин, только запостил мессагу и тут-же нашёл "GetclipboardFormatName" + в одном хелпе вычитал список встроенных форматов буфера - "CF_TEXT", "CF_BITMAP", "CF_METAFILEPICT", "CF_SYLK", "CF_DIF",
"CF_TIFF", "CF_OEMTEXT", "CF_DIB", "CF_PALETTE", "CF_PENDATA",
"CF_RIFF", "CF_WAVE", "CF_UNICODETEXT", "CF_ENHMETAFILE", "CF_HDROP (Win 95)", "CF_LOCALE (Win 95)", "CF_MAX (Win 95)", "CF_OWNERDISPLAY", "CF_DSPTEXT", "CF_DSPBITMAP", "CF_DSPMETAFILEPICT", "CF_DSPENHMETAFILE", "частный формат", "Объект GDI" ну и соотв-но коды или их диапазоны для них. Написал функцию, кот. при помощи GetclipboardFormatName по их кодам вытягивает имена форматов, вот что у меня получилось - CF_TEXT, Borland IDE Block Type, CF_LOCALE (Win 95), CF_OEMTEXT, CF_UNICODETEXT. Непонятно почему нет "CF_BITMAP", хотя 5 минут назад при копировании куска картинки из Пэйнта у меня проходило нормально как "CF_BITMAP". Может в этом хелпе неправильно коды приведены(кстати, так они вроде написаны для WIN95, а у меня XP...)?



SuperBizon   (2002-02-18 20:10) [11]

Нашёл-таки перечень форматов в MSDN, теперь вроде более-менее разобрался... Методом "научного тыка" понял, что, копируемые BITMAP файлы являются буферным форматом "CF_HDROP". Сейчас будем дальше ломать clipboard:)
2Digitman: Спасибо за помощь:)



SuperBizon   (2002-02-20 14:05) [12]

Так что, то что я копирую в буфер окромя текста, то есть файло из проводника и даже компоненты из Дельфей попадают под формат буфера "CF_HDROP"?? Неужели никак не провести более узкий анализ содержимого буфера??



SuperBizon   (2002-02-20 14:34) [13]

Блин, ещё столкнулся с одной проблемкой. Копирую кусок текста, например, из IE. Прихожит WM_DRAWCLIPBOARD на енто дело, то есть всё как надо. Закрываю тут-же IE, мне приходит ещё два WM_DRAWCLIPBOARD на тот же самый кусок текста! Почему такое происходит?? Заранее спасибо.



SuperBizon   (2002-02-22 18:16) [14]

Неужели никто не знает ответа на последние два вопроса??:))) В MSDN не нашёл ответа на поставленные вопросы...:(




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.052 c
1-94402           vlv                   2002-04-17 19:39  2002.04.29  
Диалог выбора цвета


1-94433           dnk                   2002-04-15 19:01  2002.04.29  
FreeReport.frf -> FastReport.frf


14-94544          Fellomena             2002-03-21 17:43  2002.04.29  
Из любопытства - кто-нибудь работал на системах класса В ?


14-94553          Pete                  2002-03-23 11:10  2002.04.29  
Console


1-94500           Arhangel              2002-04-16 19:04  2002.04.29  
Help!!