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.
Rode o programa abaixo , clique em Start, e ponha algum texto no Clipboard. Veja o que ocorre 
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;
}
}