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

Java使用java.awt.Robot模拟全屏游戏鼠标移动失效问题

问题:Java AWT Robot模拟鼠标移动在全屏游戏中被限制在屏幕中心

我正在开发类云游戏项目,目前使用java.awt.Robot模拟鼠标移动,但该方案在多数全屏游戏内无法正常工作。每秒记录的鼠标位置数据如下:

游戏内鼠标位置:

mouse: x = 959      y = 540
mouse: x = 959      y = 540
mouse: x = 959      y = 540
mouse: x = 959      y = 540
mouse: x = 960      y = 539
mouse: x = 959      y = 540
mouse: x = 960      y = 539
mouse: x = 960      y = 540
mouse: x = 959      y = 540
mouse: x = 959      y = 539
mouse: x = 959      y = 539
mouse: x = 959      y = 539
mouse: x = 960      y = 540
mouse: x = 960      y = 540
mouse: x = 959      y = 540
mouse: x = 959      y = 540
mouse: x = 960      y = 539
mouse: x = 959      y = 540
mouse: x = 959      y = 540
mouse: x = 959      y = 540
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 959      y = 540
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 960      y = 539
mouse: x = 947      y = 534
mouse: x = 924      y = 540

游戏外鼠标位置:

mouse: x = 1537     y = 229
mouse: x = 1537     y = 229
mouse: x = 1537     y = 229
mouse: x = 1475     y = 238
mouse: x = 1119     y = 465
mouse: x = 627      y = 943
mouse: x = 480      y = 1056
mouse: x = 575      y = 939
mouse: x = 827      y = 263
mouse: x = 616      y = 776
mouse: x = 213      y = 1005
mouse: x = 1679     y = 48
mouse: x = 1679     y = 48
mouse: x = 1679     y = 48
mouse: x = 1679     y = 48
mouse: x = 1679     y = 48
mouse: x = 1425     y = 238
mouse: x = 991      y = 443

游戏外鼠标移动正常,但游戏内鼠标被强制限制在屏幕中心(1920*1080分辨率下的960,540附近)。该问题并非反作弊系统导致,《古墓丽影:暗影》中也存在相同现象。

已尝试的解决方案:

  • 将游戏改为窗口模式,无效
  • 以管理员身份运行IDE,无效

我的目标是实现类真实操作的游戏鼠标控制,目前鼠标点击、按键操作、长按功能均正常,仅鼠标移动模拟存在问题。相关代码如下:

void animateMouse(int dx, int dy) {
    robot.mouseMove(
            MouseInfo.getPointerInfo().getLocation().x + dx,
            MouseInfo.getPointerInfo().getLocation().y + dy
    );
}

解决方案

问题根源

java.awt.Robot的mouseMove是基于系统级的绝对指针位置模拟,但现代3D游戏大多采用相对鼠标输入处理视角控制,会自动锁定鼠标到窗口中心并隐藏指针。此时系统级的绝对位置移动会被游戏的输入逻辑覆盖,导致指针被强制拉回中心。另外,你的代码中通过MouseInfo.getPointerInfo()获取当前位置累加偏移的逻辑,在鼠标被游戏锁定时,系统返回的位置始终是中心,进一步加剧了问题。

可行方案

1. 调用Windows原生API发送相对鼠标输入(Windows平台)

绕过AWT Robot,直接使用SendInput函数发送相对偏移的鼠标事件,这是游戏能识别的原生输入方式。可以通过JNA实现:

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinUser;

public class MouseSimulator {
    public static void moveMouseRelative(int dx, int dy) {
        WinUser.INPUT input = new WinUser.INPUT();
        input.type = WinUser.INPUT.INPUT_MOUSE;
        input.input.mi.dx = dx;
        input.input.mi.dy = dy;
        input.input.mi.mouseData = 0;
        input.input.mi.dwFlags = WinUser.MOUSEEVENTF_MOVE;
        input.input.mi.time = 0;
        input.input.mi.dwExtraInfo = 0;

        User32.INSTANCE.SendInput(1, new WinUser.INPUT[]{input}, input.size());
    }
}

需引入JNA依赖,此方案仅适用于Windows环境。

2. 使用虚拟HID设备驱动

通过创建虚拟HID鼠标设备模拟真实输入,这是兼容性最好的方案,但开发复杂度较高。可借助现成库(如vJoy)快速实现,避免编写底层驱动。

3. 游戏输入模式适配(兼容性差)

部分游戏支持切换为“绝对鼠标输入”模式,可在游戏设置中查找相关选项。开启后AWT Robot的绝对位置移动可能生效,但仅适用于少数支持该模式的游戏。

关键注意事项

  • 直接发送相对偏移量,不要依赖MouseInfo.getPointerInfo()获取当前位置,因为游戏锁定鼠标时该值始终为中心坐标。
  • 部分游戏需要程序以管理员权限运行才能接收虚拟输入,可尝试单独打包程序后以管理员身份启动。

内容的提问来源于stack exchange,提问作者Vaishnav Kanhirathingal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:25:25