如何刷新或清除 GetAsyncKeyState 的缓冲区
how to flush or clear GetAsyncKeyState's buffer
我在 MFC 应用程序中使用 GetAsyncKeyState
来检查是否按下了 Esc 按钮,但是当我从对话框中按下 Esc 按钮并在不同的对话框中使用 GetAsyncKeyState
时,它会返回非零值,因为它存在于消息队列中。
如何清除或刷新 GetAsyncKeyState
的缓冲区或从消息队列中删除此消息?提前谢谢。
对你的问题的直接回答是第二次调用它,丢弃第一次的值。
但我想你真正想知道的是如何读取密钥的当前状态,不管你上次检查是什么时候。由于您编写了"返回非零",因此我相信您没有正确使用它。
您需要检查值为 0x8000 的位,因为此位指示它现在是否按下。值为 1 的位是自上次检查以来按下键时设置的位,这是绊倒您的位,因此只需忽略它并直接测试值为 0x8000 的位。
示例代码:
if(GetKeyState(VK_RETURN) & 0x8000) yayReturnIsPressed();
检查if(GetKeyState(VK_RETURN))
或if(GetKeyState(VK_RETURN) != 0
不会执行您想要的操作,因为如果设置了返回值中的任何位,它将实现。
在 GetAsyncKeyState 文档中,您可以阅读:
如果设置了最高有效位,则键关闭,如果设置了最低有效位,则在上次调用 GetAsyncKeyState 后按下该键。
(强调我的)
因此,要检查 ESC 按钮的当前状态,您应该只检查最高有效位:
bool isEscPressed = GetAsyncKeyState(VK_ESCAPE) & 0x8000;
如果您像这样检查状态:if (GetAsyncKeyState(VK_ESCAPE)) {}
那么即使当前未按下 ESC,它也会进入if
语句。
相关文章:
- 清除前检查矢量
- ifstream文件在从行中读取时被清除
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如何清除/清空已打开的文件C++
- 如何在 c++ 中清除矢量容量?
- 可以清除递归函数中的变量吗?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- 结构成员在访问时被清除
- 清除输入缓冲区后未提取字符串流
- SDL_ttf清除我之前和将来的所有渲染
- 如何使用内存集清除字符数组
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- QTreeWidgetItem 设置不可选择将清除选择
- libQGLViewer 如何在没有清除缓冲区的情况下绘制
- 清除具有已删除赋值运算符的成员的类实例
- 清除结构向量时会发生什么?
- 显式清除 std::move 之后的源资源
- C++ - 重置字符串流不会重置获取位置或清除标志吗?
- std::cin 在读取 EOF 并清除后不再读取
- 清除在 main() 中分配的堆栈内存?