PDA

Ver la Versión Completa : Capturar evento "afterpaste" del portapapeles.


Jose_Pérez
11-01-2005, 09:22:38
Hola a todos:

Aquí va un pequeño reto. ¿Es posible detectar que el contenido del portapapeles ha sido pegado en otra aplicación diferente a la nuestra (algo así como un evento afterpaste)?

Saludos.

roman
11-01-2005, 23:13:52
Cuando alguien pega algo en tu aplicación recibes el mensaje WM_PASTE. Podrías crear un manejador para este mensaje y así saber cuándo sucede.

// Saludos

Jose_Pérez
12-01-2005, 09:10:27
Estimado Román:

Gracias por tu ayuda. La idea no es capturar el evento en mi aplicación, sino en otra ajena.

Ya he editado el primer mensaje para que se entinda mejor.

Saludos.

Lepe
12-01-2005, 12:21:00
var NextClipboard: THandle;
....
private
FCapturado:Boolean;
procedure CambioPortapapeles(var Msg: TWMDrawClipboard); message wm_drawclipboard;
procedure SetClpCapturado(const Value: Boolean);
public
property CapturarClipboard:Boolean read FCapturado write SetClpCapturado;

procedure TFrmPpal.SetClpCapturado(const Value: Boolean);
begin
if FCapturado <> Value then
begin
if FCapturado then
ChangeClipboardChain(FrmPpal.Handle, FrmPpal.NextClipboard)
else
NextClipboard := SetClipboardViewer(frmppal.Handle);
FCapturado := Value;
mnuHablarPortapapeles.Checked := frmppal.ClpCapturado;
end;
end;

procedure TFrmPpal.CambioPortapapeles(var Msg: TWMDrawClipboard);
var
i: Integer;
found: Boolean;
str: String;

begin
found := False;
if (Clipboard.HasFormat(CF_TEXT)) then
begin
Str := clipboard.AsText;
end;

SendMessage(NextClipboard, Msg.Msg, Msg.Msg, Msg.Msg);
// damos el nuevo contenido del portapapeles a los demas programas de windows
end;



La tecnica consiste en hacer que nuestra aplicación reciba el mensaje cada vez que en windows se dibuje algo en el portapapeles.

Tenemos que guardar en NextClipboard el siguiente programa que está monitoreando el portapapeles para informarle de que ha cambiado.

Si queremos habilitar la capturación del portapapeles, solo tenemos que hacer: Frmppal.CapturarClipboard := True;

Saludos

Jose_Pérez
12-01-2005, 13:05:56
Estimado Lepe:

Sin haber probado tu código aún, quiero comentarte algunas cosillas.

Antes de colgar mi pregunta, busqué por Internet y encontré bastante código parecido al tuyo. Lo que supongo que tú haces es generar un evento cuando se produce un cambio en el portapapelres, y lo que aquí se trata es de detectar que otra aplicación ha accedido al contenido del portapapeles (CTRL+V) y no a la inversa. Obviamente, en este caso no se produce el evento deseado, porque el contenido del portapapeles no ha sufrido cambios, ¿o me equivoco?

Y otra cosa, no consigo entender que función tiene el procedimiento SetClpCapturado(const Value: Boolean); ¿Desde donde se llama a este procedimiento?

Saludos y gracias.

Lepe
13-01-2005, 12:02:56
Pues tienes toda la razon en la primera afirmación.

La unica forma que se me ocurre es hacer un hook de teclado para las teclas ctrl+v y shift+insert que son las utilizadas para pegar. Esto tiene como fallo que si un programa no implementa teclas rápidas para pegar, entonces no lo detectarás. Busca en el foro por Hook teclado.

En cuanto a la segunda pregunta, he editado el mensaje para añadir lo que falta,fue un fallo de copy and paste.

Saludos