Mega Code Archive

 
Categories / Delphi / System
 

How to get notified when the content of the clipboard changes

Title: How to get notified when the content of the clipboard changes 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.