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

循环调用Robot的mousePress()和mouseRelease()时光标瞬移问题(仅影响macOS)

Java Robot自动点击器在macOS上光标跳回初始位置的问题

更新: 该问题仅影响macOS用户。

开发自动点击器程序时,启用后通过循环连续发送左键点击指令,但第一次点击后,后续每次点击都会将光标跳回初始点击位置——尽管从未调用mouseMove()方法。以下是复现问题的简化代码:

import java.awt.*;
import java.awt.event.InputEvent;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Robot robot;
        try {
            robot = new Robot();
        } catch (AWTException e) {
            throw new RuntimeException(e);
        }
        Thread.sleep(5000);
        for(int i = 0; i < 20; i++){
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
        }
    }
}

这是macOS系统与Java AWT交互的特殊行为:当用Robot类模拟鼠标点击时,系统会默认将光标重置到点击动作触发时的初始位置,即使没有显式调用移动光标方法。

解决方法很简单:每次执行点击操作前,先获取当前光标实际位置,再调用mouseMove()将光标移到该位置,覆盖系统的默认重置逻辑。修改后的代码如下:

import java.awt.*;
import java.awt.event.InputEvent;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Robot robot;
        try {
            robot = new Robot();
        } catch (AWTException e) {
            throw new RuntimeException(e);
        }
        Thread.sleep(5000);
        for(int i = 0; i < 20; i++){
            // 获取当前光标位置并移动到该位置
            Point currentPos = MouseInfo.getPointerInfo().getLocation();
            robot.mouseMove(currentPos.x, currentPos.y);
            
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            Thread.sleep(100);
        }
    }
}

这样每次点击都会保持在光标当前所在位置,不会再跳回初始点击点。

内容的提问来源于stack exchange,提问作者James Walker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:01:00