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

Hook на буфер обмена

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

Hook на буфер обмена

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

{ 
  *Just create a new form and call it ClipFormats. 
  *Drop a TButton and call it btnUpdate. 
  *Drop a TListBox and call it lbFormats. 

  Then just add the code below and hook up all the event handlers. 
  All it does is display all the formats currently on the clipboard and 
  updates as soon as the clipboard changes. 


  * Erstelle eine Neue Form und nenne sie ClipFormats. 
  * Plaziere einen TButton auf ihr und nenne ihn btnUpdate. 
  * Plaziere eine TListBox auf ihr und nenne sie lbFormats. 

  Dann fuge den untenstehenden Code hinzu und linke alle Ereignis-Prozedure. 
  Es zeigt dann alle Formate an, welche sich momentan in der Zwischenablage 
  befinden und wird aktualisiert, sobald sich der Inhalt der Zwischenablage  andert. 
}

 unit DynaClip;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, ExtCtrls;

 type
   TClipFormats = class(TForm)
     btnUpdate: TButton;
     lbFormats: TListBox;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure btnUpdateClick(Sender: TObject);
   private
     { Private declarations }
     NextWindow: HWND;
     procedure WMChangeCBChain(var Message: TWMChangeCBChain); message
     WM_CHANGECBCHAIN;
     procedure WMDrawClipboard(var Message: TWMDrawClipboard); message
     WM_DRAWCLIPBOARD;
   public
     { Public declarations }
   end;

 var
   ClipFormats: TClipFormats;

 implementation

 {$R *.DFM}

 procedure TMDIChildClipFormats.FormCreate(Sender: TObject);
 begin
   NextWindow := SetClipboardViewer(Handle);
 end;

 procedure TClipFormats.FormDestroy(Sender: TObject);
 begin
   ChangeClipboardChain(Handle, NextWindow);
 end;

 procedure TClipFormats.WMChangeCBChain(var Message: TWMChangeCBChain);
 begin
   with Message do
    begin
     if (Remove = NextWindow) then
      begin
       NextWindow := Next;
     end
     else
      begin
       SendMessage(NextWindow, WM_CHANGECBCHAIN, Remove, Next);
     end;
   end;
 end;

 procedure TClipFormats.WMDrawClipboard(var Message: TWMDrawClipboard);
 begin
   btnUpdate.Click;
   SendMessage(NextWindow, WM_DRAWCLIPBOARD, 0, 0);
 end;

 procedure TClipFormats.btnUpdateClick(Sender: TObject);
 const
   PreDefinedFormats: array[1..16] of string = ('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',
     'CF_LOCALE');
 var
   ClipFormat: TClipFormat;
   szBuffer: array[0..511] of Char;
   FormatID: string;
 begin
   if not OpenClipboard(Handle) then Exit;
   try
     lbFormats.Items.BeginUpdate;
     try
       lbFormats.Items.Clear;

       ClipFormat := EnumClipboardFormats(0);
       while (ClipFormat <> 0) do
        begin
         if (ClipFormat in [1..16]) then
          begin
           FormatID := PreDefinedFormats[ClipFormat];
         end
         else
          begin
           GetClipboardFormatName(ClipFormat, szBuffer, SizeOf(szBuffer));
           FormatID := string(szBuffer);
         end;
         lbFormats.Items.Add(Format('%s [%d]', [FormatID, ClipFormat]));
         ClipFormat := EnumClipboardFormats(ClipFormat);
       end;
     finally
       lbFormats.Items.EndUpdate;
     end;
   finally
     CloseClipboard;
   end;
 end;

 end.

Перевод контента на русский язык:

Это приложение Delphi, которое монтируется на системный буфер обмена и отображает форматы, которые сейчас доступны в буфере обмена, а также обновляет список в реальном времени при изменении буфера обмена.

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

  1. Форма TClipFormats имеет два основных компонента: кнопка btnUpdate и список lbFormats.
  2. В обработчике события FormCreate приложение устанавливает себя как просмотрщик буфера обмена, вызывая SetClipboardViewer.
  3. В обработчике события FormDestroy приложение удаляет себя из списка просмотрщиков буфера обмена, вызывая ChangeClipboardChain.
  4. Обработчик сообщения WMChangeCBChain используется для обнаружения изменений в цепи просмотрщиков буфера обмена.
  5. Когда буфер обмена изменяется, обработчик сообщения WMDrawClipboard вызывается, что триггерует обновление списка, имитируя клик по кнопке (btnUpdate.Click).
  6. Обработчик события btnUpdateClick перечисляет форматы, доступные в буфере обмена, используя EnumClipboardFormats, и затем пополняет список форматами ID и описаниями.
  7. Приложение использует приватную переменную NextWindow для хранения следующего окна в цепи просмотрщиков буфера обмена.

Код структурирован хорошо, но есть некоторые минорные проблемы, которые можно улучшить:

  • В обработчике сообщения WMChangeCBChain более эффективно использовать флаг boolean, чтобы указать, является ли текущее окно удаляемым из цепи просмотрщиков буфера обмена, а не проверять параметр Remove.
  • В обработчике сообщения WMDrawClipboard не ясно, почему NextWindow отправляется сообщение WM_DRAWCLIPBOARD. Могло бы быть более эффективно просто обновить список напрямую.

В этом альтернативном решении используются следующие изменения:

procedure TClipFormats.WMChangeCBChain(var Message: TWMChangeCBChain);
begin
  with Message do
    if Remove = NextWindow then
      NextWindow := Next
    else
      SendMessage(NextWindow, WM_CHANGE_CB_CHAIN, Remove, Next);
end;

procedure TClipFormats.UpdateFormats;
var
  ClipFormat: TClipFormat;
  szBuffer: array[0..511] of Char;
  FormatID: string;
begin
  lbFormats.Items.BeginUpdate;
  try
    lbFormats.Items.Clear;

    ClipFormat := EnumClipboardFormats(0);
    while ClipFormat <> 0 do
    begin
      if ClipFormat in [1..16] then
        FormatID := PreDefinedFormats[ClipFormat]
      else
        GetClipboardFormatName(ClipFormat, szBuffer, SizeOf(szBuffer));
      lbFormats.Items.AddFmt('%s [%d]', [FormatID, ClipFormat]);
      ClipFormat := EnumClipboardFormats(ClipFormat);
    end;
  finally
    lbFormats.Items.EndUpdate;
  end;
end;

procedure TClipFormats.WMDrawClipboard(var Message: TWMDrawClipboard);
begin
  UpdateFormats;
end;

В этом альтернативном решении обработчик сообщения WMDrawClipboard просто вызывает процедуру UpdateFormats, чтобы обновить список. Процедура UpdateFormats отвечает за перечисление форматов и пополнение списка. Это подход более прямолинейный и легче поддерживать.

Hook на буфер обмена - это программа на Delphi, которая отслеживает изменения в содержимом буфера обмена и отображает все доступные форматы данных.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:33:42/0.0042190551757812/0