Я пишу программу, которая прослушивает системный буфер обмена на предмет изменений. Слушатель запускается в отдельном потоке и выполняет какое-либо действие (скажем, запись в файл) при изменении содержимого буфера обмена.
Я опрашиваю буфер обмена, используя интерфейс 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.
Это похоже на то, что поток переходит в спящий режим, когда программа теряет фокус, но последний триггер события все еще срабатывает, когда он просыпается. Можно ли как-то предотвратить этот сон?