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

SendInput()函数相关代码问题求助——右键触发Ctrl按键逻辑导致系统卡顿

问题分析与代码修复

你的代码主要存在两个核心问题:CPU占用过高导致系统卡顿,以及逻辑上的冗余和边界情况处理缺失。下面我会逐一拆解问题,并给出修复后的完整代码。

问题拆解

  • CPU满负载卡顿:CtrlPress函数里的while(true)死循环没有任何休眠机制,会让CPU核心一直处于100%占用状态,直接拖慢系统运行。必须给循环添加短暂休眠,让CPU能腾出资源处理其他任务。
  • 逻辑漏洞:
    • 右键按住时,代码会无差别重复执行“延迟-按Ctrl-保持-释放”流程,既没有检查中途右键是否松开,也没有跟踪Ctrl的当前状态,导致重复发送无效按键事件。
    • 右键松开分支里有多余的分号(keyRelease(0x1D);;),属于语法冗余。
    • 等待1秒或保持Ctrl的3秒期间,无法实时响应右键松开的操作,不符合你“松开右键立即停止并释放Ctrl”的需求。

修复后的代码

#include <windows.h>
#include <thread>

void keyPress(WORD keyCode) {
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = keyCode;
    input.ki.dwFlags = KEYEVENTF_SCANCODE;
    SendInput(1, &input, sizeof(INPUT));
}

void keyRelease(WORD keyCode) {
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = keyCode;
    input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &input, sizeof(INPUT));
}

void CtrlPress() {
    bool isCtrlPressed = false;
    bool isRightButtonHeld = false;

    while (true) {
        // 检测右键当前的按下状态(GetAsyncKeyState最高位表示是否处于按住状态)
        bool currentRightButtonState = (GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0;

        if (currentRightButtonState) {
            if (!isRightButtonHeld) {
                // 刚按下右键,重置状态变量
                isRightButtonHeld = true;
                isCtrlPressed = false;
            }

            if (!isCtrlPressed) {
                // 延迟1秒后执行按下操作
                Sleep(1000);
                // 再次确认右键仍处于按住状态,避免中途松开
                if ((GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0) {
                    keyPress(0x1D);
                    isCtrlPressed = true;

                    // 保持Ctrl按下3秒,期间实时检查右键状态
                    DWORD startTime = GetTickCount();
                    while ((GetTickCount() - startTime) < 3000) {
                        if ((GetAsyncKeyState(VK_RBUTTON) & 0x8000) == 0) {
                            // 右键已松开,提前释放Ctrl并重置状态
                            keyRelease(0x1D);
                            isCtrlPressed = false;
                            isRightButtonHeld = false;
                            break;
                        }
                        Sleep(10); // 避免子循环占用CPU
                    }

                    // 如果3秒计时结束且右键仍按住,释放Ctrl
                    if (isCtrlPressed) {
                        keyRelease(0x1D);
                        isCtrlPressed = false;
                    }
                }
            }
        } else {
            if (isRightButtonHeld) {
                // 右键刚松开,立即释放Ctrl(如果当前处于按下状态)
                if (isCtrlPressed) {
                    keyRelease(0x1D);
                    isCtrlPressed = false;
                }
                isRightButtonHeld = false;
            }
        }

        Sleep(10); // 核心:给CPU留空闲时间,彻底解决卡顿问题
    }
}

int main() {
    CtrlPress();
}

关键改动说明

  1. 添加循环休眠:在主循环和保持Ctrl的子循环中都加入了Sleep(10),让CPU不会被持续占用,直接解决卡顿问题。
  2. 状态变量跟踪:用isCtrlPressed和isRightButtonHeld跟踪当前按键状态,避免重复发送无效按键指令,同时准确处理右键按下/松开的边界情况。
  3. 实时状态检测:在等待1秒和保持Ctrl的3秒期间,持续检查右键状态,一旦松开立即释放Ctrl并终止当前流程,完全符合你的需求。
  4. 修复语法冗余:移除了右键松开分支里多余的分号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:19:08