Привет. В delphi для работы с буфером обмена есть модуль ClipBoard, ещё можно работать с буфером через api. Но мы сегодня не будем углубляться в работу с буфером. Наша задача – отследить изменение буфера обмена.
Это всё сводится к обработке сообщения WM_DRAWCLIPBOARD, но дело в том, что никто просто так нам его не отправит.
Немного теории.
Есть такое понятие, как «Clipboard chain» - назовём это цепочкой буфера обмена. Фактически в ней содержится список handle’ов окон, которым посылается сообщение WM_DRAWCLIPBOARD. На самом деле оно посылается только первому окну в цепочке. И каждое окно в этой цепочке должно (обязано :) ) обрабатывать это сообщение и ещё одно, о котором речь пойдёт дальше.
Поехали!
Итак, как же нам попасть в эту цепочку? Для этого есть функция SetClipboardViewer.
Создадим новый проект, на событие создания формы (или в любой другой нужный нам момент) напишем:
nhwnd:=SetClipboardViewer(Handle);
nhwnd – глобальная переменная типа Cardinal (тот же THandle), в неё мы получили следующий в цепочке handle, она нам пригодится в других процедурах.
Теперь нужно позаботиться о том, чтобы удалять себя из цепочки в том случае, когда нам уже не нужно перехватывать обновление информации в буфере – например, при закрытии.
procedure TForm1.FormDestroy(Sender: TObject); begin ChangeClipboardChain(Handle, nwnd); end;
Функция ChangeClipboardChain удаляет нас из цепочки. Функция рассылает сообщение WM_CHANGECBCHAIN окнам цепочки, нам это сообщение также предстоит обработать. Обычно возвращает false, true только в случае, если наше окно в цепочке было единственным. Нам результат этой функции не очень-то и важен.
Обработаем WM_CHANGECBCHAIN. Для тех, кто подзабыл: в раздел private типа TForm1 пишем procedure WMChangeCBChain(var msg: TWMChangeCBChain); message WM_CHANGECBCHAIN; и обрабатываем:
procedure TForm1.WMChangeCBChain(var msg: TWMChangeCBChain); begin if msg.Remove=nwnd then nwnd:=msg.Next else SendMessage(nwnd, WM_CHANGECBCHAIN, msg.Remove, msg.Next); end;
Здесь всё тоже несложно: если удалилось следующее в цепочке окно, берём на заметку – меняем nwnd на теперь действительное следующее окно. Иначе уведомляем следующее окно, как этого требует цепочка.
Осталось только обработать событие WM_DRAWCLIPBOARD:
procedure TForm1.WMDrawClipBoard(var msg: TWMDrawClipboard);
begin
if ClipBoard.HasFormat(CF_TEXT) then
ShowMessage(ClipBoard.AsText)
else
ShowMessage('скопирован не текст');
SendMessage(nwnd, WM_DRAWCLIPBOARD, 0, 0);
end;
Вот так вот, всё просто. Смотрим, что скопировано, делаем, что нам нужно, и отправляем сообщение по цепочке дальше.
Не зная об этом, я раньше ставил таймер, который постоянно следил за буфером, – систему не тормозило, но это был обходной путь. Всё равно, что арендовать квартиру на месяц, когда нужна только посуточная аренда.
Для ленивых предлагаю скачать исходник.
(c) crystalbit, http://parsers.info
При копировании материала обязательно ставить прямую ссылку на источник.
Блин, ненавижу дельпфи :( разве нету другого варианта ?
Судя по всему, другие яп ты тоже ненавидишь. API и сообщения это не дельфи, их можно много где реализовать
Дельфи может и вымерает, но легче и понятней дельфи не найти…
ради бога! используй те самые методы в ассемблере! никкто тебя заставляет предпочитать делф
Ну то не читай!
ненавидишь дельпфи ? Ну тогда что ты тут вообще забыл ? =)
Интересная статья, мне в свое время пришлось маны курить. Молодец, кому-то ты явно помог.
Да ладно?
Такую статью еще в том году встречал.
Да не я такой не видал) Спс помогла.
Интересная статья. Раньше программировал на делфях, но потом забросил. Сейчас снова хочется писать программы, поскольку появились интересные компоненты и модули.
Программирую на делфе уже несколько месяцев. Не больно-то и получается, но в принципе некоторые вещички получаются очень неплохо.
Пока что еще застой, связанный с неимением идей о написании программы.
делфи – прошлый век.
Слава холиварам! =)
…и троллям!))
А ты вообще девушка, так что молчать!
=D
C++ РЕШАЕТ!1111
Не не не! Delphi всегда был и осанется лучше всех!!!)))
прошлый не прошлый, а живет и пользуется вниманием, так что не надо таких категоричных заявлений еще и без аргументов!
делфи будущий век, ога. недостижимое будущее.
Делфи всё старый уже, но в нём уже столько понакручено, что и уходить на другие смысла нет!
События рулят
Делфи сейчас весьма популярен, но думаю что это еще не все понял, что его возможности безграничны, в скором времени думаю его сделаю еще более простым и функциональным.
Не стоит забывать сколько программе лет))
Дельфи как таковой вымер еще году так в 2008 =) о какой популярности речь идет?
я работал немного с дельфи….очень легкий язык….
Куда пропал-то? :)
Да вот времени совсем нету :)
Не то, что совсем, но уже отошёл от программирования.
Есть пара заготовок для серьёзных постов, может как-нибудь и допишу :)
у меня сайт в закладках уже примерно два года) жаль, что перестал обновляться.
Делфи сейчас популярен, тока думаю что это еще не все понял что и как , что его возможности безграничны по идее , в скором времени думаю его сделаю еще более простым и функциональным и наворотами и писать моно будет еще быстрее.
А не на Делфи такое можно реализовать? Я его совсем не знаю :(
на дельфи можно делать отличные вещи а ламерам все не эдак всё не так
По-моему, делфи будет жить ровно столько, сколько на нем будут писать. По мне, то все языки должны умереть, которые не компиляца на linux и windows вместе
делфи будущий век, ога. недостижимое будущее.
спасибо полезная статья, я тоже всегда использовал таймер )), теперь попробуем так
Интересная статья, мне в свое время пришлось маны курить. Молодец, кому-то ты явно помог.
Delphi- это хорошо, но C и Qt – другой уровень
Я тоже за то, что есть уже более гибкие языки. Хотя все это дело привычки.
Переходим на си шарп главный разработчик дельфи теперь разрабатывает его =)
Самый мощный язык программирования – С, он всегда им был и всегда останется. Но делфи попроще для новичков
C и Qt еще не каждому дадутся, а делфи – язык для новичков, позволяющий на базовых основах понять программирование. Только, зараза, мороки с ним много.
Мне лично не понравился Делфи, сложно((
Crystalbit, а почему так редко писать стали?
других дел полно)
только на днях с этой вещью крутились, а тут статья! Круто! Мы с помощью нее исправили некоторые ошибки! :-)
Спасибо за сатью, очень интересно написано, С базовый язык программирвания, лучше ни чего нет!Любую задачу можно реализовть, сам сейчас новичок в этом деле!
Не любишь делфи – любишь бейсик
Тогда ступай,об стенку бейся!
)))
делфи – прошлый век, я уже забыл даже что это такое
Почему же вчерашний день? Лично мне делфи нравится намного больше бейсика. Для меня она удобнее.
Делфи єто не прошлый век! А для тех кто нечего не понимает в этом посмотри в интернете ! умник тут нашелся!
Хороший совет. Многие наверное и забыли, что такое делфи.