我在MFC应用程序中使用GetAsyncKeyState
检查是否按下了Esc按钮,
但是当我按下对话框中的Esc按钮并在另一个对话框中使用GetAsyncKeyState
时,它返回非零值,因为它存在于消息队列中。
如何清除或刷新GetAsyncKeyState
缓冲区或从邮件队列中删除此邮件?
提前谢谢。
答案 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
将无法执行您想要的操作,因为如果设置了返回值中的任何位,则会完成此操作。