10

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){}}

}

私が見逃している/間違っていることは何ですか?

[更新] ここに投稿された同様の問題を見つけました: OSX にフォーカスがない場合、Java スレッドがスリープ状態になり ます。

4

2 に答える 2

1

この問題を回避するエレガントな方法はないようです。NSPasteboard はクリップボードの所有権の概念を提供していません。ネイティブの Objective C を記述しても、この問題を解決することはできません。

唯一の解決策は、クリップボードを定期的にサンプリングすることです。

于 2012-10-02T10:10:59.360 に答える