使用以下方法获得按键事件的差异是什么?
GetKeyState()
GetAsyncKeyState()
getch()
?
我应该在何时使用它们?
GetKeyState()和GetAsyncKeyState()是Windows特定的API,而getch()适用于其他非Windows特定的C编译器。
GetKeyState()从线程的消息队列中返回键盘状态。该状态不反映与硬件相关联的中断级状态。
GetAsyncKeyState()指定了自上次调用GetAsyncKeyState()以来按下键和键当前是向上还是向下的状态。如果最高位被设置,则该键是按下状态,如果最低位被设置,则该键在上一次调用GetAsyncKeyState()之后被按下。
在实践中,我发现如果你按住一个键并在按下该键时分配一个行为,如果你使用GetKeyState(),那么比起使用GetAsyncKeyState(),这个行为会被调用更多次。
在游戏中,我更喜欢使用GetAsyncKeyState()。
(您也可以在MSDN博客上查看更多详细信息)。
先来看一下 async 所表示的意思。
GetAsyncKeyState()
异步获取按键状态,也就是说它不需要等待什么,立即返回结果。
GetKeyState()
同步获取按键状态,它会返回你即将调用 getch()
读取的那个按键状态,并且该状态已经在键盘缓冲区中等待被处理。
举个例子,假设以下键位被敲击,但还未被读取:
GetAsyncKeyState()
立即返回 ctrl 按下
。
GetKeyState()
将返回 H 按下
直到你调用 getch()
。
然后,GetKeyState()
将返回 I 按下
直到你再次调用 getch()
。
接着,GetKeyState()
将返回 shift 和 1 按下
直到你调用 getch()
,此时它将返回 !
(按下 shift+1 所得到的结果)。
最后,GetKeyState()
将返回 ctrl 按下
。
getch()
并搜索GetKeyState() vs. GetAsyncKeyState()
也是如此。 - Markus Meskanen