C++鼠标移动代码异常:设置左移50px却移动过多
解决鼠标移动距离超出设定值的问题
问题原因
你使用的mouse_event(MOUSEEVENTF_MOVE, -50, 0, 0, 0)中的移动参数会受到系统鼠标加速设置的影响,它并非精确的像素偏移量,而是基于鼠标驱动的加速算法计算后的移动值,所以实际移动距离会和预期的50px不符。
解决方案
方案1:直接使用SetCursorPos设置绝对坐标
这种方式最简单直接,通过获取当前光标位置,计算出目标位置后直接设置,完全不受鼠标加速影响,能保证精确的像素移动:
#include <iostream> #include <Windows.h> using namespace std; int main() { POINT p; SetCursorPos(1920, 540); while (1) { GetCursorPos(&p); // 计算向左移动50px后的坐标并设置 SetCursorPos(p.x - 50, p.y); GetCursorPos(&p); cout << p.x << endl; Sleep(2000); } }
方案2:使用SendInput模拟精确移动
如果需要更复杂的输入模拟场景,SendInput是更推荐的API(mouse_event已被标记为过时),通过绝对坐标模式也能实现精确移动:
#include <iostream> #include <Windows.h> using namespace std; int main() { POINT p; SetCursorPos(1920, 540); // 获取屏幕分辨率 int screenWidth = GetSystemMetrics(SM_CXSCREEN); int screenHeight = GetSystemMetrics(SM_CYSCREEN); while (1) { GetCursorPos(&p); INPUT input = {0}; input.type = INPUT_MOUSE; // 启用绝对坐标移动模式 input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; // 将像素坐标转换为SendInput要求的0-65535范围 input.mi.dx = (p.x - 50) * 65535 / screenWidth; input.mi.dy = p.y * 65535 / screenHeight; SendInput(1, &input, sizeof(INPUT)); GetCursorPos(&p); cout << p.x << endl; Sleep(2000); } }
效果验证
两种方案运行后都会输出符合预期的结果:
1870 1820 1770 1720 etc...
内容的提问来源于stack exchange,提问作者aXsd
相关产品推荐
相关产品推荐

