Mac OS X上的剪贴板监控| Java的

时间:2012-04-17 05:44:06

标签: java multithreading macos awt clipboard

我在Mac OS X上从系统剪贴板获取数据时遇到了麻烦。 我想要做的是每次收到新的[基于文本的]信息时,都要收听系统剪贴板并打印剪贴板的内容。

问题:下面的代码在Windows 7和openSUSE Linux机器上完美运行,但是当我尝试在Mac OS X上运行相同的代码时,程序无法打印剪贴板的新内容,直到关注应用程序。 [在点击停靠栏上的应用程序图标之前,没有任何内容打印...]

我的源代码:

import java.awt.Toolkit;  
import java.awt.datatransfer.*;  
import java.io.IOException;  

public class ClipboardListener extends Thread implements ClipboardOwner {

    Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();  

    public void run(){  
        Transferable selection = systemClipboard.getContents(this);  
        gainOwnership(selection);  
    }  

    public void gainOwnership(Transferable t){ 
        try {this.sleep(100);} 
        catch (InterruptedException e) {e.printStackTrace();}
        systemClipboard.setContents(t, this);  
    }  

    public void lostOwnership(Clipboard clipboard, Transferable contents) {
        try {System.out.println((String) clipboard.getData(DataFlavor.stringFlavor));} 
        catch (UnsupportedFlavorException e) {} 
        catch (IOException e) {}
        gainOwnership(contents);  
    }  
}

public class myApp {

    public static void main(String[] args){
        ClipboardListener listener = new ClipboardListener();
        listener.start();
        while(true){}}

}

我缺少什么/做错了什么?

[更新] 我在此处发现了类似的问题:Java thread goes to sleep when not in focus on OSX 但是使用命令“java -jar myApp.jar&”对我来说没有解决方法。

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

似乎没有优雅的方法解决这个问题,NSPasteboard不提供剪贴板所有权概念。 You can't even solve this problem writing native Objective C.

唯一的解决方案是定期对剪贴板进行采样。