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