不是在自己的程序中监听剪贴板的变化 而是系统的使用中发生了剪切复制这类操作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吧。
哦 这个东西不能办到,而且是不可能办到的。
而且操作系统是不可能让你这么干的 呵呵
相信我吧兄弟。