我正在编写一个程序来监听系统剪贴板的变化。侦听器在单独的线程上运行,并在剪贴板的内容更改时执行一些操作(例如,写入文件)。
我正在使用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 上没有遇到这个问题。
这就像程序失去焦点时线程进入睡眠状态,但最后一个事件触发器在它醒来时仍然会触发。有什么办法可以防止这种睡眠吗?