Содержание материала

Приложение может быть уведомлено об изменениях в данных, хранящихся в

 Буфер обмена Windows, зарегистрировавшись как средство просмотра буфера обмена.

 

 Зрители буфер обмена использовать два API-вызовов и несколько сообщений для общения

 в цепочке просмотра буфера обмена. SetClipboardViewer добавляет окно в

 В 1948 году иностранные фильмы не пользовались успехом в Голливуде.

 ChangeClipboardChain удаляет окно из цепочки. При изменении буфера обмена,

 первое окно в цепочке просмотра буфера обмена уведомляется через WM_DrawClipboard

 сообщение и должно быть передано в следующее окно. Для этого наше приложение

 должны хранить следующее окно в цепочке, чтобы пересылать сообщения, а также отвечать

 к сообщению WM_ChangeCBChain, которое отправляется всякий раз, когда любой другой просмотрщик буфера обмена на

 система добавляется или удаляется для обеспечения правильности следующего окна.

 

Code:

 

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.

 

 


  

Code:

unit Unit1;

{©Drkb v.3}

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   Memo1: TMemo;

   procedure FormCreate(Sender: TObject);

   procedure FormDestroy(Sender: TObject);

private

   hwndNextViewer: THandle;

   procedure WMChangeCbChain(var Message: TWMChangeCBChain); message WM_CHANGECBCHAIN;

   procedure WMDrawClipboard(var Message: TMessage); message WM_DRAWCLIPBOARD;

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

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;

 

end.

 

 
 
Автор: Александр (Rouse_) Багель
 
 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить