Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить уведомление при изменении содержимого буфера обмена

Delphi , ОС и Железо , Буфер обмена

Получить уведомление при изменении содержимого буфера обмена

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  An application can be notified of changes in the data stored in the 
  Windows clipboard by registering itself as a Clipboard Viewer. 

  Clipboard viewers use two API calls and several messages to communicate 
  with the Clipboard viewer chain. SetClipboardViewer adds a window to the 
  beginning of the chain and returns a handle to the next viewer in the chain. 
  ChangeClipboardChain removes a window from the chain. When a clipboard change occurs, 
  the first window in the clipboard viewer chain is notified via the WM_DrawClipboard 
  message and must pass the message on to the next window. To do this, our application 
  must store the next window along in the chain to forward messages to and also respond 
  to the WM_ChangeCBChain message which is sent whenever any other clipboard viewer on 
  the system is added or removed to ensure the next window along is valid. 
}


 unit Unit1;

 interface

 uses
   Windows, Messages, Forms, Classes, Controls, StdCtrls;

 type
   TForm1 = class(TForm)
     Button1: TButton;
     Button2: TButton;
     procedure Button1Click(Sender : TObject);
     procedure Button2Click(Sender : TObject);
     procedure FormCreate(Sender : TObject);
     procedure FormDestroy(Sender : TObject);
   private
     FNextClipboardViewer: HWND;
     procedure WMChangeCBChain(var Msg : TWMChangeCBChain); message WM_CHANGECBCHAIN;
     procedure WMDrawClipboard(var Msg : TWMDrawClipboard); message WM_DRAWCLIPBOARD;
   end;

 var
   Form1 : TForm1;

 implementation

 {$R *.DFM}

 procedure TForm1.FormCreate(Sender : TObject);
 begin
   { Initialize variable }
   FNextClipboardViewer := 0;
 end;


 procedure TForm1.Button1Click(Sender : TObject);
 begin
   if FNextClipboardViewer <> 0 then
     MessageBox(0, 'This window is already registered!', nil, 0)
   else
     { Add to clipboard chain }
     FNextClipboardViewer := SetClipboardViewer(Handle);
 end;


 procedure TForm1.Button2Click(Sender : TObject);
 begin
   { Remove from clipboard chain }
   ChangeClipboardChain(Handle, FNextClipboardViewer);
   FNextClipboardViewer := 0;
 end;


 procedure TForm1.WMChangeCBChain(var Msg : TWMChangeCBChain);
 begin
   inherited;
   { mark message as done }
   Msg.Result := 0;
   { the chain has changed }
   if Msg.Remove = FNextClipboardViewer then
     { The next window in the clipboard viewer chain had been removed. We recreate it. }
     FNextClipboardViewer := Msg.Next
   else
     { Inform the next window in the clipboard viewer chain }
     SendMessage(FNextClipboardViewer, WM_CHANGECBCHAIN, Msg.Remove, Msg.Next);
 end;


 procedure TForm1.WMDrawClipboard(var Msg : TWMDrawClipboard);
 begin
   inherited;
   { Clipboard content has changed }
   try
     MessageBox(0, 'Clipboard content has changed!', 'Clipboard Viewer', MB_ICONINFORMATION);
   finally
     { Inform the next window in the clipboard viewer chain }
     SendMessage(FNextClipboardViewer, WM_DRAWCLIPBOARD, 0, 0);
   end;
 end;


 procedure TForm1.FormDestroy(Sender : TObject);
 begin
   if FNextClipboardViewer <> 0 then
   begin
     { Remove from clipboard chain }
     ChangeClipboardChain(Handle, FNextClipboardViewer);
     FNextClipboardViewer := 0;
   end;
 end;

 end.

Программный код на Delphi демонстрирует создание приложения Windows, которое получает уведомления о изменении содержимого системного буфера обмена. Приложение регистрируется как просмотрщик буфера обмена, вызывая SetClipboardViewer, и обрабатывает два сообщения: WM_CHANGE_CBCHAIN и WM_DRAWCLIPBOARD.

Вот разбивка кода:

  1. В методе FormCreate приложение инициализирует переменную FNextClipboardViewer, чтобы хранить.handle следующего окна в цепи просмотрщиков буфера обмена.
  2. Метод Button1Click добавляет приложение в цепь просмотрщиков буфера обмена, вызывая SetClipboardViewer. Он также проверяет, является ли приложение уже зарегистрированным, и отображает сообщение об ошибке, если это так.
  3. Метод Button2Click удаляет приложение из цепи просмотрщиков буфера обмена, вызывая ChangeClipboardChain.
  4. Метод WMChangeCBChain обрабатывает сообщение WM_CHANGE_CBCHAIN, которое отправляется, когда просмотрщик буфера обмена добавлен или удален. Он обновляет переменную FNextClipboardViewer и передает сообщение следующему окну в цепи, если это необходимо.
  5. Метод WMDrawClipboard обрабатывает сообщение WM_DRAWCLIPBOARD, которое отправляется, когда содержимое буфера обмена изменяется. Он отображает сообщение о том, что содержимое буфера обмена изменилось, и затем передает сообщение следующему окну в цепи.
  6. В методе FormDestroy приложение удаляет себя из цепи просмотрщиков буфера обмена, если оно еще зарегистрировано.

Код предоставляет два кнопки: одну для добавления приложения в цепь просмотрщиков буфера обмена и другую для удаления. Когда приложение зарегистрировано как просмотрщик буфера обмена, оно будет получать уведомления о изменении содержимого буфера обмена.

Вот некоторые предложения по улучшению кода:

  • Вместо использования глобальных переменныхconsider encapsulating the clipboard viewer handling logic within a separate class or unit.
  • Consider adding more robust error handling and debugging capabilities.
  • If you plan to use this code in a production environment, consider implementing additional security measures to prevent unauthorized access to the system clipboard.

В целом, код предоставляет хороший старт для создания приложения Windows, которое получает уведомления о изменении содержимого системного буфера обмена.

Получить уведомление при изменении содержимого буфера обмена - можно это сделать, зарегистрировав свою программу как просмотрщик буфера обмена и получив уведомления о смене содержимого через WM_DRAWCLIPBOARD и WM_CHANGECBCHAIN сообщения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Буфер обмена ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:55:37/0.0036678314208984/0