Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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 не нашёл ответа на поставленные вопросы...:(



Страницы: 1 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.006 c
1-94359
NS
2002-04-17 11:57
2002.04.29
Нужно в RUN-Time создавать экземпляры некоторых объектов (для при


14-94541
Knight
2002-03-21 13:21
2002.04.29
вопросик имеется... типа


1-94381
Каспер
2002-04-17 09:19
2002.04.29
TReeView мигание!


3-94279
yozhik
2002-04-08 13:29
2002.04.29
Проблема с ADO


1-94508
Sound
2002-04-17 01:06
2002.04.29
Как узнать полный путь до exe файла моей программы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский