如何用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
相关产品推荐
相关产品推荐

