如何在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
相关产品推荐
相关产品推荐

