我正在编写一个程序来监听系统剪贴板的更改。侦听器在单独的线程上运行,并在剪贴板的内容更改时执行某些操作(例如写入文件)。
我正在使用轮询剪贴板剪贴板所有者界面 http://www.javapractices.com/topic/TopicAction.do?Id=82,这样当我的程序失去剪贴板的所有权(意味着另一个进程修改了剪贴板)时,我的程序中就会触发一个事件,让我读取更改。
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 键切换到 Dock 中正在运行的进程图标时,对剪贴板的任何更改才会反映出来。因此,如果在切换到停靠图标之前有多个剪贴板操作,则只有最后一个有效果。我在 Linux 或 Windows 上没有遇到这个问题。
这就好像当程序失去焦点时线程会进入睡眠状态,但当它醒来时最后一个事件触发器仍然会触发。有什么办法可以阻止这种睡眠吗?
我怀疑 OSX 不提供剪贴板更改的通知,因此 Java 正在尽其所能,在它因其他原因被唤醒时通知您。
我的怀疑来自于NSP纸板 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSPasteboard_Class/Reference/Reference.html#//apple_ref/occ/cl/NSPasteboard文档,changeCount
特别是例行公事。它说“因此,您可以在获得粘贴板所有权时记录更改计数,然后将其与从changeCount返回的值进行比较,以确定您是否仍然拥有所有权。”没有提到使用事件来检测更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)