2016-04-26 107 views
1

我在快乐的MFC应用程序中使用GetAsyncKeyState检查,如果按下Esc键按钮, 但是当我按下从对话框ESC键在不同的对话框中使用GetAsyncKeyState它,因为它的存在,则返回非零在消息队列中。如何刷新或清除GetAsyncKeyState的缓冲区

如何清除或清除GetAsyncKeyState的缓冲区或从消息队列中删除此消息? 在此先感谢。

+0

它看起来像'GetKeyState'完全符合你的要求,来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx –

回答

2

GetAsyncKeyState文档,你可以阅读:

如果最显著位设置,关键是下,如果至少显著位设置,关键是以前后按调用GetAsyncKeyState。

(重点煤矿)

所以要检查ESC键,你应该只检查最显著位的当前状态:

bool isEscPressed = GetAsyncKeyState(VK_ESCAPE) & 0x8000; 

如果你检查这样的状态:if (GetAsyncKeyState(VK_ESCAPE)) {}那么它就会进入if即使ESC未被按下,也是如此。

+0

我是使用'这需要花费大量的时间,当我使用 (函数GetKeyState(VK_RETURN)为0x8000) 没有工作@MarcinJędrzejewski –

+0

@AmirYouhana然后不使用函数GetKeyState但GetAsyncKeyState, – marcinj

+0

@AmirYouhana对不起,我一个函数内部GetAsyncKeyState'错误使用GetKeyState在我的答案,而不是GetAsyncKeyState – marcinj

1

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

但我想,你真的想知道的是如何读取的关键当前状态,无论何时你最后一次检查的。既然你写了“返回非零”,我相信你没有正确使用它。

您需要检查值为0x8000的位,因为该位指示是否现在按。值为1的位是如果自上次检查以来按下该键时设置的那个位,并且这是一个让您跳过的位,所以忽略它并直接测试值为0x8000的位。

示例代码:

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

检查if(GetKeyState(VK_RETURN))if(GetKeyState(VK_RETURN) != 0不会做你想做的,因为如果任何在返回值位被设置它将会实现。

+0

我正在使用'GetAsyncKeyState'里面需要很多时间,当我使用(GetKeyState(VK_RETURN)&0x8000)它没有工作的函数@CherryDT –

+0

好吧,让你是否想继续使用“自上次检查后被按下?”功能,但只是有办法清除这个缓冲状态?在这种情况下,就像我上面所说的那样:调用该键的函数隐式清除缓冲区。 – CherryDT