Приложение может быть уведомлено об изменениях в данных, хранящихся в
Буфер обмена 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.
|
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!