Foro de elhacker.net

Programación => Java => Mensaje iniciado por: p4nd4criss en 4 Junio 2012, 01:52 am



Título: ¿como detectar cuando alguien copia algo al portapapeles? java
Publicado por: p4nd4criss en 4 Junio 2012, 01:52 am
ha algún evento k me alerte cuando alguien copia algo al porta-papeles
ya conozco la solución de LOSTOWNERSHIP
incluso aki tengo el codigo
Código:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.Transferable;

public class ClipboardTextListener {

Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Owner owner = new Owner();
    public void comienzaAEscuchar () {
        
        
        cb.addFlavorListener(new CentinelaFlavor (cb) );
        Transferable contents = cb.getContents(owner);
        cb.setContents(contents, owner);
    }
    class Owner implements ClipboardOwner{
        @Override
        public void lostOwnership(Clipboard clipboard, Transferable contents) {
            try {Transferable newContents = clipboard.getContents(this);
            if (contents.getTransferData(DataFlavor.stringFlavor).equals(newContents.getTransferData(DataFlavor.stringFlavor)))  return;
            clipboard.setContents(newContents, this);
            System.out.println("a");
            textoHaCambiado ( (String) clipboard.getData(DataFlavor.stringFlavor));
            } catch (Exception e) {
                System.out.println ("No fue texto"); //Puedes borrar esto
            }
        }
    }
    class CentinelaFlavor implements FlavorListener {
        private Clipboard c;
        public CentinelaFlavor (Clipboard c) {
            this.c = c;
        }
        public void flavorsChanged(FlavorEvent e) {
            try {
                System.out.println("b");
                Owner o = new Owner();
                String nuevaString = (String) c.getContents(o).getTransferData(DataFlavor.stringFlavor);
                c.setContents(c.getContents(o), new Owner() );
                textoHaCambiado ( nuevaString);
            } catch (Exception ex) {System.out.println ("No fue texto 2");/*Puedes borrar este*/ }
        }
    }
    protected void textoHaCambiado(String nuevoTexto) {
        System.out.println(nuevoTexto);

    }
}
cuando alguien reemplaza el contenido del portapapeles lee el nuevo contenido y vuelve a subir ese contenido declarando ownership otra ves

pero surge un problema si mas de una aplicación hace esto
digamos si el Jdownloader esta funcionando al mismo tiempo, y copio algun texto ambos programas
se pelean por el portapepeles

uno le quita ownership al otro, y el otro se la vuelve a quitar al primero ,causando k el primero se la quite al segundo.......

existe alguna otra solución?
algun evento que escuche el portapepeles?

gracias gente :3