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

如何用std::vector/std::array简化多按键统计与时长测量代码

简化按键统计代码的方案

先定义一个结构体,把单个按键的所有统计数据封装起来,避免零散变量:

#include <iostream>
#include <chrono>
#include <windows.h>
#include <array> // 使用std::array需包含此头文件,用std::vector则换成#include <vector>

struct KeyStats {
    char key;
    int pressCount = 0;
    float totalDuration = 0.0f;
    bool isReleased = true; // 初始状态按键为松开
    std::chrono::time_point<std::chrono::steady_clock> pressStart;
};

接着用std::array(固定数量按键)或std::vector(动态添加按键)管理所有需要统计的按键,再通过遍历容器实现统一处理:

int main()
{
    // 初始化需要统计的按键,后续新增按键直接在这里添加即可
    std::array<KeyStats, 2> keys = {{ {'A'}, {'W'} }};
    // 若用vector动态添加:
    // std::vector<KeyStats> keys;
    // keys.push_back({'A'});
    // keys.push_back({'W'});

    while (true)
    {
        // 遍历所有按键,用一套逻辑处理
        for (auto& keyData : keys)
        {
            if (GetAsyncKeyState(keyData.key) & 0x8000)
            {
                if (keyData.isReleased)
                {
                    ++keyData.pressCount;
                    std::cout << keyData.key << "_Times_Pressed: " << keyData.pressCount << std::endl;
                    keyData.pressStart = std::chrono::steady_clock::now();
                    keyData.isReleased = false;
                }
            }
            else
            {
                if (!keyData.isReleased)
                {
                    auto finish = std::chrono::steady_clock::now();
                    std::chrono::duration<float> duration = finish - keyData.pressStart;
                    float currentDuration = duration.count() * 1000.0f;
                    keyData.totalDuration += currentDuration;
                    
                    std::cout << keyData.key << "_Hold_Duration [ms]: " << currentDuration << "ms" << std::endl;
                    std::cout << keyData.key << "_Total_Hold_Duration [ms]: " << keyData.totalDuration << "ms" << std::endl;
                    keyData.isReleased = true;
                }
            }
        }
        // 加小延迟降低CPU占用
        Sleep(10);
    }

    return 0;
}

改动说明

  • 结构体封装:将单个按键的按压次数、总时长、释放状态、按压开始时间打包到KeyStats中,避免每个按键重复定义大量变量。
  • 容器管理:用std::array或std::vector统一存放按键数据,新增按键仅需在容器初始化时添加对应元素,无需重复编写检测逻辑。
  • 统一处理逻辑:通过遍历容器,用一套代码完成所有按键的统计,彻底消除冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:50