Java设置剪贴板后无法获取其他程序修改的剪贴板内容
Java设置剪贴板后无法获取其他程序修改内容的解决方法
问题原因
Java的Clipboard实例在调用setContents()后,会内部缓存设置的内容,后续直接调用该实例的getContents(null)时,不会主动同步系统剪贴板的最新状态,导致返回的仍是之前设置的旧值——哪怕系统剪贴板已经被其他程序修改。
解决方案
在读取剪贴板内容前,重新获取系统剪贴板的实例,强制Java从系统剪贴板拉取最新数据,而非使用缓存的旧实例。同时可适当延长延迟时间,确保其他程序的复制操作完全完成。
修改后的测试代码
try { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection("empty"), null); Robot robot = new Robot(); // 执行全选操作 robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_A); robot.keyRelease(KeyEvent.VK_A); robot.keyRelease(KeyEvent.VK_CONTROL); // 延长延迟确保操作完成,可根据实际情况调整 robot.delay(200); // 执行复制操作 robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_C); robot.keyRelease(KeyEvent.VK_C); robot.keyRelease(KeyEvent.VK_CONTROL); // 关键:重新获取剪贴板实例,避免缓存旧值 Clipboard freshClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); String currentContents = freshClipboard.getContents(null).getTransferData(DataFlavor.stringFlavor).toString(); System.out.println(currentContents); } catch (AWTException | UnsupportedFlavorException | IOException e) { e.printStackTrace(); }
额外提示
- 如果需要实时监听剪贴板变化,可以实现
ClipboardOwner接口,或者给剪贴板添加FlavorListener,当剪贴板内容变更时触发回调,确保总能获取最新值。 - 延迟时间可根据目标程序的响应速度调整,避免因操作未完成导致读取失败。
内容的提问来源于stack exchange,提问作者James Henderson
相关产品推荐
相关产品推荐

