procedure TForm1.FormCreate(Sender: TObject);
begin
// Add the window to the clipboard viewer chain.
hwndNextViewer := SetClipboardViewer(Handle);
Memo1.Lines.Clear
end;
procedure TForm1.WMChangeCbChain(var Message: TWMChangeCBChain);
begin
with Message do
begin
// If the next window is closing, repair the chain.
if Remove = hwndNextViewer then
hwndNextViewer := Next
// Otherwise, pass the message to the next link.
else
if hwndNextViewer <> 0 then
SendMessage(hwndNextViewer, Msg, Remove, Next);
end;
end;
// clipboard contents changed.
procedure TForm1.WMDrawClipboard(var Message: TMessage);
begin
// Pass the message to the next window in clipboard
// viewer chain.
Memo1.Lines.Add('Сhanged');
with Message do
SendMessage(hwndNextViewer, Msg, WParam, LParam);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain(Handle, hwndNextViewer);
end;
Это код на Delphi, демонстрирующий управление изменениями содержимого буфера обмена с помощью механизма цепи просмотра буфера обмена Windows API.
Объявление единицы и формы
Единица Unit1 объявляет форму TForm1, которая имеет два приватных переменных: hwndNextViewer (указатель на следующую форму в цепи просмотра буфера обмена) и три процедуры: WMChangeCbChain, WMDrawClipboard и FormDestroy.
Процедура FormCreate
Процедура FormCreate вызывается при создании формы. Она устанавливает цепь просмотра буфера обмена, вызывая функцию Windows API SetClipboardViewer, чтобы добавить указатель на форму (Handle) в цепь.
Также она очищает содержимое memo-контрола (Memo1).
Процедура WMChangeCbChain
Процедура WMChangeCbChain обрабатывает сообщение WM_ CHANGECBCHAIN, которое отправляется, когда следующая форма в цепи просмотра буфера обмена закрывается. В этом случае она обновляет переменную hwndNextViewer, чтобы указать на новый следующий элемент в цепи.
Если следующий элемент не закрывается (Remove не равно hwndNextViewer), процедура передает сообщение следующему элементу в цепи, используя функцию Windows API SendMessage.
Процедура WMDrawClipboard
Процедура WMDrawClipboard обрабатывает сообщение WM_DRAWCLIPBOARD, которое отправляется, когда содержимое буфера обмена изменяется. В этом случае она добавляет строку в memo-контроль (Memo1), указывающую, что содержимое буфера обмена изменилось.
Также она передает сообщение следующему элементу в цепи, используя функцию Windows API SendMessage.
Процедура FormDestroy
Процедура FormDestroy вызывается при уничтожении формы. Она удаляет указатель на форму из цепи просмотра буфера обмена, вызывая функцию Windows API ChangeClipboardChain.
Альтернативное решение
Вместо реализации custom clipboard viewer можно использовать компонент Delphi TClipboardViewer, чтобы мониторить изменения содержимого буфера обмена.
В этом примере форма создает компонент TClipboardViewer и устанавливает его событие OnClipboardChanged на процедуру MyOnClipboardChanged. Когда содержимое буфера обмена изменяется, процедура MyOnClipboardChanged вызывается, добавляя строку в memo-контроль, указывающую, что содержимое буфера обмена изменилось.
Контроль за изменением содержимого буфера обмена в приложении на языке Delphi реализуется с помощью обработки сообщений WM_CHANGECBCHAIN и WM_DRAWCLIPBOARD.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.