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

时间:2016-04-26 15:58:38

标签: c++ mfc

我在MFC应用程序中使用GetAsyncKeyState检查是否按下了Esc按钮, 但是当我按下对话框中的Esc按钮并在另一个对话框中使用GetAsyncKeyState时,它返回非零值,因为它存在于消息队列中。

如何清除或刷新GetAsyncKeyState缓冲区或从邮件队列中删除此邮件? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

GetAsyncKeyState文档中,您可以阅读:

  

如果设置了最高有效位,则键为 ,如果设置了最低有效位,则在上次调用GetAsyncKeyState后按下该键。

(强调我的)

所以要检查ESC按钮的当前状态,你应该只检查最重要的位:

bool isEscPressed = GetAsyncKeyState(VK_ESCAPE) & 0x8000;

如果你检查这样的状态:if (GetAsyncKeyState(VK_ESCAPE)) {}那么即使当前没有按下ESC,它也会输入if语句。

答案 1 :(得分:1)

直接回答你的问题只是第二次调用它,从第一次丢弃这个值。

但我想你真正想知道的是如何读取密钥的当前状态,无论你上次检查什么时候。既然你写了"返回非零"我相信你没有正确使用它。

您需要检查值为0x8000的位,因为这个位表示它是否立即按 。值为1的位是自上次检查后按下键时设置的位,并且是那个跳过你的位,所以只需忽略它并直接测试值为0x8000的位。

示例代码:

if(GetKeyState(VK_RETURN) & 0x8000) yayReturnIsPressed();

检查if(GetKeyState(VK_RETURN))if(GetKeyState(VK_RETURN) != 0将无法执行您想要的操作,因为如果设置了返回值中的任何位,则会完成此操作。