Java怎么监听系统剪贴板的变化 ?

不是在自己的程序中监听剪贴板的变化 而是系统的使用中发生了剪切复制这类操作Java怎么监听 ? 需要JNI? 还是开个线程每一秒都做一次对比么 ...... 但是这样的话开销就不小了 请大家赐教

不然要是有这种软件 就天下打乱了。你做什么都可能监听到,那就完咯 呵呵。

JAVA 应该可以获取 系统 剪贴板的,你说的JNI应该由JAVA帮你封装实现了,你可以看看:

[quote]
你可以试试使用ClipboardOwner这个接口。
覆盖lostOwnership(Clipboard clipboard,Transferable contents)方法。
这个接口的“注册”很简单,在调用Clipboard对象的setContents(Transferable,ClipboardOwner)方法时,输入第二个参数就行了。
注意:如果你想要一直监视剪贴板就在lostOwnership方法中调用你要监视的剪贴板的setContents方法“注册”自己(指的是ClipboardOwner接口)。

FlavorListenter接口的方法只有在你所复制的内容的风格(DataFlavor)集合变化时才被回调。
[/quote]

[quote]systemClipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); /quote]

获得系统剪贴板对象

刚才那个没编辑好。
[quote]
systemClipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard();
[/quote]
获得系统剪贴板对象

另外,在CSDN有这么个帖子,你可以参考一下:
[url]http://topic.csdn.net/u/20101201/11/cf2d6c26-9e87-4bb9-ad5a-ba899c1e3394.html[/url]

看下面代码,ctrl+c /ctrl+v 也可以,你就在复制的时候做你监听的额外工作,比如代码[code="java"]
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;

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

public class MainFrame extends JFrame {

private JPanel jContentPane = null;
private JTextArea jTextArea = null;
private JPanel jPanel = null;
private JButton jButton=new JButton();
private JButton jButton1=new JButton();
Clipboard cd=Toolkit.getDefaultToolkit().getSystemClipboard();

/**

  • This is the default constructor
    */
    public MainFrame() {
    super();
    initialize();
    }

    /**

  • This method initializes this

  • @return void
    */
    private void initialize() {
    jButton.setText("COPY");
    jButton.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
    jb_actionPerformed(e);
    }
    });
    jButton1.setText("PASTE");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
    jb1_actionPerformed(e);
    }
    });
    this.setSize(300, 200);
    this.setContentPane(getJContentPane());
    this.setTitle("\"HAIT'S CODE\"");
    }

    protected void jb1_actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    try{
    Transferable tr=cd.getContents(this);
    if(tr!=null){
    String s=(String)tr.getTransferData(DataFlavor.stringFlavor);
    if(s!=null)
    this.jTextArea.insert(s,this.jTextArea.getCaretPosition());
    }
    }catch(Exception err){
    err.printStackTrace();
    }

    }

    protected void jb_actionPerformed(ActionEvent e) {

    StringSelection ss=new StringSelection(this.jTextArea.getText());
    cd.setContents(ss,ss);

    }

    /**

  • This method initializes jContentPane

  • @return javax.swing.JPanel
    */
    private JPanel getJContentPane() {
    if (jContentPane == null) {
    jContentPane = new JPanel();
    jContentPane.setLayout(new BorderLayout());
    jContentPane.add(getJTextArea(), java.awt.BorderLayout.CENTER);
    jContentPane.add(getJPanel(), java.awt.BorderLayout.SOUTH);
    }
    return jContentPane;
    }

    /**

  • This method initializes jTextArea

  • @return javax.swing.JTextArea
    */
    private JTextArea getJTextArea() {
    if (jTextArea == null) {
    jTextArea = new JTextArea();
    }
    return jTextArea;
    }

    /**

  • This method initializes jPanel

  • @return javax.swing.JPanel
    */
    private JPanel getJPanel() {
    if (jPanel == null) {
    jPanel = new JPanel();
    jPanel.add(jButton, null);
    jPanel.add(jButton1, null);
    }
    return jPanel;
    }

}

[/code]

还有 你是用的swing吧。

哦 这个东西不能办到,而且是不可能办到的。
而且操作系统是不可能让你这么干的 呵呵
相信我吧兄弟。