Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-01-2005
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Capturar evento "afterpaste" del portapapeles.

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.

Última edición por Jose_Pérez fecha: 12-01-2005 a las 09:11:39.
Responder Con Cita
  #2  
Antiguo 11-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 12-01-2005
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
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.

Última edición por Jose_Pérez fecha: 12-01-2005 a las 09:12:46.
Responder Con Cita
  #4  
Antiguo 12-01-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Código Delphi [-]

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

Última edición por Lepe fecha: 13-01-2005 a las 12:07:06.
Responder Con Cita
  #5  
Antiguo 12-01-2005
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 13-01-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:43:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi