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

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

 Буфер обмена 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.

 

 

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

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

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

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


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