4

我正在编写一个程序来监听系统剪贴板的变化。侦听器在单独的线程上运行,并在剪贴板的内容更改时执行一些操作(例如,写入文件)。

我正在使用ClipboardOwner 接口轮询剪贴板,因此当我的程序失去对剪贴板的所有权(意味着另一个进程已修改剪贴板)时,我的程序中会触发一个事件,让我读取更改。

public class OwnershipClipboardListener extends Thread implements ClipboardOwner
{
    private Clipboard clipB = Toolkit.getDefaultToolkit().getSystemClipboard();

    public void run()
    {
        /* Initialize ClipboardListener and gain ownership of clipboard */
    }

    @Override
    public void lostOwnership(Clipboard clipboard, Transferable transferable)
    {
        /* Auto-fired when I lose Clipboard ownership.
           Can do processing and regaining ownership here */
    }    
}

问题是,在 OSX 中运行时,只有当我手动 Cmd-Tab 到停靠栏中正在运行的进程图标时,才会反映对剪贴板的任何更改。所以如果在我切换到停靠图标之前有多个剪贴板操作,只有最后一个有任何影响。我在 Linux 或 Windows 上没有遇到这个问题。

这就像程序失去焦点时线程进入睡眠状态,但最后一个事件触发器在它醒来时仍然会触发。有什么办法可以防止这种睡眠吗?

4

2 回答 2

1

我怀疑 OSX 不提供剪贴板更改的通知,因此 Java 正在尽其所能通过在由于其他原因被唤醒时通知您。

我的怀疑来自NSPasteboard文档,changeCount尤其是例程。它说“因此,您可以在获得粘贴板所有权时记录更改计数,然后将其与从 changeCount 返回的值进行比较,以确定您是否仍然拥有所有权。” 没有提到使用事件来检测更改。

于 2012-04-06T05:11:12.293 回答
0

看来基思是对的。但是,您可以通过将应用程序发送到后台(在 *Nix 上)来解决问题:

java -jar clipboard-1.0.jar &

这将在后台打开 Java 应用程序,并且不需要窗口焦点来触发通知。

于 2012-04-11T05:41:32.747 回答