我在快乐的MFC应用程序中使用GetAsyncKeyState
检查,如果按下Esc键按钮, 但是当我按下从对话框ESC键在不同的对话框中使用GetAsyncKeyState
它,因为它的存在,则返回非零在消息队列中。如何刷新或清除GetAsyncKeyState的缓冲区
如何清除或清除GetAsyncKeyState
的缓冲区或从消息队列中删除此消息? 在此先感谢。
我在快乐的MFC应用程序中使用GetAsyncKeyState
检查,如果按下Esc键按钮, 但是当我按下从对话框ESC键在不同的对话框中使用GetAsyncKeyState
它,因为它的存在,则返回非零在消息队列中。如何刷新或清除GetAsyncKeyState的缓冲区
如何清除或清除GetAsyncKeyState
的缓冲区或从消息队列中删除此消息? 在此先感谢。
在GetAsyncKeyState文档,你可以阅读:
如果最显著位设置,关键是下,如果至少显著位设置,关键是以前后按调用GetAsyncKeyState。
(重点煤矿)
所以要检查ESC键,你应该只检查最显著位的当前状态:
bool isEscPressed = GetAsyncKeyState(VK_ESCAPE) & 0x8000;
如果你检查这样的状态:if (GetAsyncKeyState(VK_ESCAPE)) {}
那么它就会进入if
即使ESC未被按下,也是如此。
直接回答你的问题将只是第二次调用它,从第一次丢弃的价值。
但我想,你真的想知道的是如何读取的关键当前状态,无论何时你最后一次检查的。既然你写了“返回非零”,我相信你没有正确使用它。
您需要检查值为0x8000的位,因为该位指示是否现在按。值为1的位是如果自上次检查以来按下该键时设置的那个位,并且这是一个让您跳过的位,所以忽略它并直接测试值为0x8000的位。
示例代码:
if(GetKeyState(VK_RETURN) & 0x8000) yayReturnIsPressed();
检查if(GetKeyState(VK_RETURN))
或if(GetKeyState(VK_RETURN) != 0
不会做你想做的,因为如果任何在返回值位被设置它将会实现。
我正在使用'GetAsyncKeyState'里面需要很多时间,当我使用(GetKeyState(VK_RETURN)&0x8000)它没有工作的函数@CherryDT –
好吧,让你是否想继续使用“自上次检查后被按下?”功能,但只是有办法清除这个缓冲状态?在这种情况下,就像我上面所说的那样:调用该键的函数隐式清除缓冲区。 – CherryDT
它看起来像'GetKeyState'完全符合你的要求,来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx –