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

基于C++实现带分段方向控制的无后坐力鼠标脚本问询

问题描述

本人刚接触脚本开发,对相关技术较为困惑。已用C++编写基础鼠标移动脚本(代码如下),但当前代码仅能让鼠标呈方形抖动。现需针对枪械后坐力模式(初期上偏左,扫射中途右偏且强度提升),实现脚本先将鼠标向下向右移动,一段时间后切换为向左移动的分段动作,同时希望为X、Y坐标添加定时器以抵消锯齿状后坐力,解决现有动作一次性执行导致方形移动的问题,请问该如何修改代码实现需求?

#include <windows.h>
#include <tlhelp32.h>

bool keyDown(int vcode)
{
    return GetAsyncKeyState(vcode) & ~32767;
}

int main(void)
{
    bool isOn = true;
    while (!keyDown(121))
    {
        if (keyDown(120))
        {
            isOn = !isOn;
            Sleep(200);
        }

        if (keyDown(1) && isOn)
        {
            Sleep(25);
            mouse_event(MOUSEEVENTF_MOVE, 0, 10, 0, 0);
            Sleep(25);
            mouse_event(MOUSEEVENTF_MOVE, -10, 0, 0, 0);
            Sleep(25);
            mouse_event(MOUSEEVENTF_MOVE, 10, 0, 0, 0);
        }
        Sleep(1);
    }
    return 0;
}
修改方案

核心调整思路

  • 分段后坐力修正:将扫射过程拆分为「初期向下向右」和「中期向左强化」两个阶段,通过计时变量判断当前阶段,匹配对应移动参数。
  • 平滑轨迹消除锯齿:把一次性大位移拆分为多次小幅度移动,配合短间隔延时,替代原有的方形抖动逻辑。
  • 状态跟踪重置:记录扫射启动时间,松开左键时重置状态,确保每次扫射都从初始阶段开始。

修改后的完整代码

#include <windows.h>

// 检查按键按下状态(修正原逻辑的位运算问题)
bool keyDown(int vcode)
{
    return (GetAsyncKeyState(vcode) & 0x8000) != 0;
}

int main(void)
{
    bool isOn = true;
    const int INITIAL_PHASE_MS = 1200; // 初期阶段持续时长(可根据枪械调整)
    DWORD sprayStartTick = 0; // 扫射启动时间戳

    while (!keyDown(VK_F10)) // F10键退出程序
    {
        // F9键切换脚本开关状态
        if (keyDown(VK_F9))
        {
            isOn = !isOn;
            Sleep(200); // 防重复触发
        }

        if (keyDown(VK_LBUTTON) && isOn)
        {
            // 首次按下左键时记录启动时间
            if (sprayStartTick == 0)
            {
                sprayStartTick = GetTickCount();
            }

            DWORD elapsedMs = GetTickCount() - sprayStartTick;
            int xDelta = 0, yDelta = 0;

            // 阶段1:初期修正(抵消上偏左后坐力)
            if (elapsedMs < INITIAL_PHASE_MS)
            {
                xDelta = 1;  // 小幅度右移
                yDelta = 2;  // 小幅度下移
            }
            // 阶段2:中期强化修正(抵消右偏且增强的后坐力)
            else
            {
                xDelta = -2; // 左移幅度提升
                yDelta = 3;  // 下移幅度同步提升
            }

            // 执行小步移动,保证轨迹平滑
            mouse_event(MOUSEEVENTF_MOVE, xDelta, yDelta, 0, 0);
            Sleep(10); // 短延时控制移动频率,消除锯齿
        }
        else
        {
            // 松开左键,重置扫射状态
            sprayStartTick = 0;
        }

        Sleep(1);
    }
    return 0;
}

关键修改说明

  1. 阶段控制逻辑:用GetTickCount()获取系统时间戳,计算扫射持续时长,以此切换不同阶段的移动参数,贴合枪械后坐力变化规律。
  2. 平滑移动实现:将原代码中一次性10像素的移动拆分为每次1-3像素的小位移,配合10ms延时,让鼠标轨迹连贯自然,解决方形抖动问题。
  3. 按键常量优化:用VK_LBUTTON(左键)、VK_F9(开关)、VK_F10(退出)替代硬编码数字,提升代码可读性和维护性。
  4. 状态重置机制:松开左键时重置sprayStartTick,确保每次重新扫射都从初始阶段开始,避免阶段混乱。

自定义调整建议

  • 可根据目标枪械的实际后坐力,修改INITIAL_PHASE_MS的时长,以及xDelta、yDelta的数值,找到最适配的修正幅度。
  • 如果需要更精细的弹道控制,可增加更多阶段划分,或加入加速度曲线,让后坐力修正更贴近真实弹道变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:01:16