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

基于<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:47