基于<Windows.h>的C++鼠标圆周移动脚本故障排查
解决鼠标圆周移动时固定不动的问题
核心问题排查
你的代码里有两个致命错误导致鼠标固定在一点:
- 角度累加逻辑错误:
degree = +degree_increm是赋值操作而非累加,导致所有循环中degree始终等于degree_increm,计算出的坐标完全相同。 - 三角函数参数类型错误:
cos和sin函数要求传入弧度值,但你直接传入角度值,小角度的余弦值接近1、正弦值接近0,最终坐标几乎没有变化。
修复后的完整代码
#include <Windows.h> #include <iostream> #include <cmath> #include <cstdlib> #include <ctime> void move_mouse_circle() { int steps = 500; int radius = 200; float degree = 0.0f; bool add_inconsistency = false; char add_incon_answ; std::cout << "请输入平滑移动的步数(默认500):"; std::cin >> steps; std::cout << "请输入圆周半径(默认200):"; std::cin >> radius; std::cout << "是否添加随机延迟模拟人类操作?y/n:"; std::cin >> add_incon_answ; add_inconsistency = (add_incon_answ == 'y' || add_incon_answ == 'Y'); // 初始化随机数种子,避免每次随机序列重复 srand(static_cast<unsigned int>(time(nullptr))); float* x_coord = new float[steps]; float* y_coord = new float[steps]; // 用浮点数除法计算角度增量,避免整数截断 float degree_increm = 360.0f / steps; for (int i = 0; i < steps; i++) { // 角度转弧度:弧度 = 角度 × π / 180 float radian = degree * M_PI / 180.0f; x_coord[i] = radius * cos(radian); y_coord[i] = radius * sin(radian); // 正确累加角度 degree += degree_increm; } std::cout << "3秒后开始... "; Sleep(1000); std::cout << "2秒后开始... "; Sleep(1000); std::cout << "1秒后开始... " << std::endl; Sleep(990); POINT curr_cursor_p; GetCursorPos(&curr_cursor_p); int curr_x = curr_cursor_p.x; int curr_y = curr_cursor_p.y; for (int u = 0; u < steps; u++) { // 转换为整数,匹配SetCursorPos的参数类型 int target_x = static_cast<int>(x_coord[u] + curr_x); int target_y = static_cast<int>(y_coord[u] + curr_y); SetCursorPos(target_x, target_y); if (add_inconsistency) { float millis = 2.0f + (1 + rand() % 50) / 100.0f; Sleep(static_cast<DWORD>(millis)); } else { Sleep(2); } } delete[] x_coord; delete[] y_coord; } int main() { move_mouse_circle(); return 0; }
额外优化建议
- 内存节省:可以去掉提前存储坐标的动态数组,直接在移动循环中实时计算坐标,减少内存占用:
// 移除动态数组相关代码,修改移动循环 float degree = 0.0f; float degree_increm = 360.0f / steps; for (int u = 0; u < steps; u++) { float radian = degree * M_PI / 180.0f; int target_x = static_cast<int>(radius * cos(radian) + curr_x); int target_y = static_cast<int>(radius * sin(radian) + curr_y); SetCursorPos(target_x, target_y); // 延迟逻辑保持不变 degree += degree_increm; } - 延迟合理性:原代码的随机延迟范围是2.012.5秒,可根据需求调整为更小的范围(比如1050毫秒),更贴近人类操作节奏。
内容的提问来源于stack exchange,提问作者kinginges
相关产品推荐
相关产品推荐

