如何刷新或清除 GetAsyncKeyState 的缓冲区

how to flush or clear GetAsyncKeyState's buffer

本文关键字:清除 GetAsyncKeyState 缓冲区 何刷新 刷新      更新时间:2023-10-16

我在 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语句。