使用GetKeyState()函数能否检测键盘按键的释放状态?
关于GetKeyState检测按键释放状态的解答
核心结论
可以使用GetKeyState()检测键盘按键的释放状态,你之前对两个状态位的对应关系理解有误,修正后即可实现需求。
状态位正确含义
GetKeyState()返回的short值里,两个标记位的实际作用如下:
- 高位
0x8000:瞬时按下标记,该位为1代表调用函数的瞬间目标按键处于按下状态,为0代表按键已经释放 - 低位
0x01:切换状态标记,仅对CapsLock、NumLock这类开关类按键有效,代表该按键当前是否处于激活生效状态,不适合用来判断普通按键的瞬时按下/释放状态
需求实现方案
你定义的KEY_PRESS宏应该对应0x8000而非0x01,检测释放的逻辑只需要判断0x8000位是否为0即可,不要在函数内写阻塞等待逻辑,会卡住线程消息循环,修正后的参考代码如下:
// 先定义正确的状态宏 #define KEY_PRESS 0x8000 #define KEY_RELEASE 1 #define KEY_PRESS_MODE 0 short Input(int Key, int Mode) { short keyState = GetKeyState(Key); if (Mode == KEY_RELEASE) { // 返回非0代表按键已经释放 return !(keyState & KEY_PRESS); } else // KEY_PRESS_MODE { // 返回非0代表按键处于按下状态 return keyState & KEY_PRESS; } }
额外注意事项
GetKeyState的状态是基于当前线程的消息队列更新的,只有当线程处理了按键相关的窗口消息后,状态才会刷新,适合普通窗口程序的输入检测- 如果你需要读取全局实时的按键硬件状态,可以改用
GetAsyncKeyState,用法和GetKeyState一致,只需要判断高位0x8000即可
内容的提问来源于stack exchange,提问作者Sqwah
相关产品推荐
相关产品推荐

