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

如何在DirectX及同类游戏中模拟硬件级鼠标移动?

解决FPS游戏中模拟鼠标移动的问题

一、FPS游戏处理鼠标输入的核心原理

大部分现代FPS游戏(如CS、Valorant、HL2等)不会依赖系统光标坐标处理视角控制,而是通过Windows Raw Input API直接读取鼠标硬件的相对位移数据(dx/dy,即鼠标相对于上一帧的移动量)。游戏会主动将系统光标锁定在屏幕中心,然后根据每帧读取到的相对位移计算视角转动——这就是普通修改光标位置的方法无效的原因:游戏根本不读取光标坐标,只认硬件级的相对移动信号。

二、可行的C/C++模拟方法

1. 使用SendInput发送相对鼠标移动

SendInput是Windows提供的可模拟硬件级输入的API,只要发送相对位移的鼠标事件,就能被游戏的Raw Input系统识别。核心是设置MOUSEEVENTF_MOVE标志,dx/dy传入相对位移值(范围为-32768到32767,对应鼠标移动的相对距离)。

示例代码:

#include <windows.h>

// 模拟相对鼠标移动,dx/dy为相对位移量
void SimulateRelativeMouseMove(int dx, int dy) {
    INPUT input = {0};
    input.type = INPUT_MOUSE;
    // 传入相对位移,无需设置MOUSEEVENTF_ABSOLUTE
    input.mi.dx = dx;
    input.mi.dy = dy;
    input.mi.dwFlags = MOUSEEVENTF_MOVE;
    input.mi.time = 0;
    input.mi.dwExtraInfo = GetMessageExtraInfo();

    // 发送1个输入事件
    SendInput(1, &input, sizeof(INPUT));
}

// 调用示例:模拟连续向右移动鼠标(正dx对应右移,正dy对应下移)
int main() {
    for (int i = 0; i < 10; i++) {
        SimulateRelativeMouseMove(50, 0);
        Sleep(10);
    }
    return 0;
}

2. 进阶:驱动级/HID设备模拟(谨慎使用)

如果游戏反作弊系统拦截了SendInput,可以考虑模拟HID鼠标设备或编写底层驱动发送鼠标信号,但这种方法复杂度极高,且大概率违反游戏反作弊协议,可能导致账号封禁,仅用于学习研究。

三、为什么你之前的方法无效?

  • Python库(PyAutoGUI/PyDirectInput):这类库默认使用绝对位置修改(SetCursorPos)或带绝对标志的SendInput,未发送相对位移信号,游戏无法识别。
  • Windows API的SetCursorPos:仅修改系统光标显示位置,不涉及鼠标硬件位移数据,游戏的Raw Input系统不会读取该值。
  • 移动1像素后移回:两次移动的相对位移总和为0,游戏计算的是累计位移量,因此视角不会产生变化。

四、相关搜索关键词

  • Windows Raw Input API mouse
  • SendInput relative mouse movement
  • FPS game mouse input simulation
  • HID mouse emulation C++

内容的提问来源于stack exchange,提问作者Grammar Naci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:52:09