如何实现按键触发代码仅执行一次?当前按键触发逻辑为持续执行直至再次按键
解决按键单次触发问题
你的问题出在GetKeyState的使用方式上——它检测的是按键当前的持续状态,只要按键按住,每次循环都会触发对应的操作,所以会连续执行。要实现按一次键只执行一次,我们需要检测按键的按下边缘(也就是从松开状态切换到按下状态的瞬间),这就需要记录上一次的按键状态,对比当前状态来判断是否是首次按下。
下面是修改后的代码:
void test() { bool active = true; int num = 0; // 记录上一次按键的状态,初始为未按下 bool prevPageUpState = false; bool prevPageDownState = false; while (active) { // 获取当前按键状态:0x8000位表示按键是否被按住 bool currPageUpState = (GetKeyState(VK_PRIOR) & 0x8000) != 0; bool currPageDownState = (GetKeyState(VK_NEXT) & 0x8000) != 0; // 只有当当前按下且上一次未按下时,才执行操作(单次触发) if (currPageUpState && !prevPageUpState) { num++; cout << num << endl; } if (currPageDownState && !prevPageDownState) { num--; cout << num << endl; } // 更新上一次的按键状态,供下一次循环判断 prevPageUpState = currPageUpState; prevPageDownState = currPageDownState; // 可选:添加小延迟,避免循环过于频繁占用CPU Sleep(50); } }
关键说明:
GetKeyState(VK_PRIOR) & 0x8000:这个位运算用来提取GetKeyState返回值的最高位,该位为1表示按键当前处于按住状态。- 状态对比:通过
currState && !prevState判断这是按键首次按下的瞬间,只会触发一次操作,直到按键松开再按下才会再次触发。 Sleep(50):添加小延迟可以减少循环的执行频率,降低CPU占用,你可以根据需求调整这个值。
内容的提问来源于stack exchange,提问作者Lintee
相关产品推荐
相关产品推荐

