El truco 214 de TRUCOMANIA es "Capturar cambios en el contenido del portapaeles"
Te lo reproduzco integro por si te puede ayudar. Te interesa sobre todo la parte del procedimiento WMDrawClipboard que se ejecuta cuando hay un cambio en el contenido del portapapeles
Código:
Tal como hacen programas como el GetRight, por ejemplo, que monitorizan el portapapeles reaccionando cuando
hay algo que le interese tratar.
En este truco haremos un pequeño visor del portapapeles. Capturaremos texto o imagenes.
-Pon un TRichEdit (RichEdit1) y un TImage (Image1) en tu form
-Añade 'ClipBrd' en el uses de tu form
-Define estas dos procedures en la parte private de tu form:
private
{ Private declarations }
procedure WMDrawClipboard (var message : TMessage);
message WM_DRAWCLIPBOARD;
procedure WMChangeCBCHain (var message : TMessage);
message WM_CHANGECBCHAIN;
-Define esta variable global a tu form (es decir, ponla en el var de la form):
var
Form1: TForm1;
MangoSiguienteVisor : THandle;
-Ahora, pon en la implementation las dos procedures que trataran los mensajes que nos interesan del
portapapeles:
procedure TForm1.WMDrawClipboard (var message : TMessage);
begin
message.Result := SendMessage(WM_DRAWCLIPBOARD, MangoSiguienteVisor, 0, 0);
{Esto se ejecutará cuando haya un cambio en el contenido del portapapeles}
{This code is executed when the clipboard contents change}
if Clipboard.HasFormat(CF_TEXT) then RichEdit1.Text := Clipboard.AsText
else
if Clipboard.hasFormat(CF_BITMAP) then
with Image1.Picture.Bitmap do
LoadFromClipboardFormat(CF_BITMAP,
ClipBoard.GetAsHandle(CF_BITMAP),0);
end;
procedure TForm1.WMChangeCBCHain (var message : TMessage);
begin
if message.wParam = MangoSiguienteVisor then begin
MangoSiguienteVisor := message.lParam;
message.Result := 0;
end else begin
message.Result := SendMessage(MangoSiguienteVisor, WM_CHANGECBCHAIN,
message.wParam, message.lParam);
end;
end;
-Ahora, mete este código en el evento OnCreate de tu form:
procedure TForm1.FormCreate(Sender: TObject);
begin
MangoSiguienteVisor := SetClipboardViewer(Handle);
end;
-Y este otro en el OnDestroy:
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain(Handle, MangoSiguienteVisor);
end;
Y tendrás un visor del portapapeles. Ejecuta la aplicación y mete algo en el portapapeles para probarlo.