Monitorar área de transferência

Gente, eu sei que tem muitos tópicos sobre esse assunto aqui no fórum, mas nenhum me esclareceu.

Como eu faço para monitorar a área de transferência do SO? Eu preciso de uma notificação sempre que o usuário apertar CRTL+C.

Eu preciso ficar escutando o clipboard eternamente até que o usuário feche o programa.

Procure por addFlavorListener.

http://download.oracle.com/javase/7/docs/api/java/awt/datatransfer/Clipboard.html

Rode o programa abaixo , clique em Start, e ponha algum texto no Clipboard. Veja o que ocorre :slight_smile:

package guj;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class ClipboardWatcher extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JScrollPane scpText = null;
    private JTextArea txtText = null;
    private JPanel pnlButtons = null;
    private JButton btnStart = null;
    private JButton btnStop = null;
    
    private Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();  //  @jve:decl-index=0:
    private FlavorListener flavorListener = new FlavorListener() {
        @Override
        public void flavorsChanged(FlavorEvent e) {
            if (systemClipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
                try {
                    String str = systemClipboard.getData (DataFlavor.stringFlavor).toString();
                    txtText.append(str);
                } catch (IOException ex) {
                } catch (UnsupportedFlavorException ex) {
                }
            }
        }
    };
    
    private JScrollPane getScpText() {
        if (scpText == null) {
            scpText = new JScrollPane();
            scpText.setViewportView(getTxtText());
        }
        return scpText;
    }

    private JTextArea getTxtText() {
        if (txtText == null) {
            txtText = new JTextArea();
        }
        return txtText;
    }

    private JPanel getPnlButtons() {
        if (pnlButtons == null) {
            pnlButtons = new JPanel();
            pnlButtons.setLayout(new FlowLayout());
            pnlButtons.add(getBtnStart(), null);
            pnlButtons.add(getBtnStop(), null);
        }
        return pnlButtons;
    }

    private JButton getBtnStart() {
        if (btnStart == null) {
            btnStart = new JButton();
            btnStart.setText("Start!");
            btnStart.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    btnStart.setEnabled(false);
                    btnStop.setEnabled(true);
                    systemClipboard.addFlavorListener(flavorListener);
                }
            });
        }
        return btnStart;
    }

    private JButton getBtnStop() {
        if (btnStop == null) {
            btnStop = new JButton();
            btnStop.setText("Stop!");
            btnStop.setEnabled(false);
            btnStop.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    btnStart.setEnabled(true);
                    btnStop.setEnabled(false);
                    systemClipboard.removeFlavorListener(flavorListener);
                }
            });
        }
        return btnStop;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ClipboardWatcher thisClass = new ClipboardWatcher();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    public ClipboardWatcher() {
        super();
        initialize();
    }

    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("Clipboard Watcher");
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getScpText(), BorderLayout.CENTER);
            jContentPane.add(getPnlButtons(), BorderLayout.SOUTH);
        }
        return jContentPane;
    }
}