10

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

问题:下面的代码在 Windows 7 和 openSUSE Linux 机器上运行良好,但是当我尝试在 Mac OS X 上运行相同的代码时,程序无法打印剪贴板的新内容,直到将焦点放在应用程序上。[在我单击 Dock 上的应用程序图标之前,什么都不会打印...]

我的源代码:

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 go to sleep when not in focus on OSX 但是使用命令“java -jar myApp.jar &”对我来说不是一种解决方法。

4

2 回答 2

3

这似乎是一个开放的错误,请参阅MACOSX_PORT-511 ClipboardOwner 方法 lostClipboard is not called if app is not focus。

于 2012-04-21T12:19:23.477 回答
1

似乎没有解决这个问题的优雅方法,NSPasteboard 不提供剪贴板所有权概念。你甚至不能用原生的 Objective C 来解决这个问题。

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

于 2012-10-02T10:10:59.360 回答