You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:07:07