GetKeySate和GetAsyncState辨析

风之子赛拉飞尔 2013-02-04 11:18:38
MSDN阐释:
MSDN2008:
ms-help://MS.MSDNQTR.v90.chs/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/getkeystate.htm
ms-help://MS.MSDNQTR.v90.chs/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/getasynckeystate.htm
Internet:
http://msdn.microsoft.com/en-us/library/ms646301%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms646293(v=vs.85).aspx

互联网文章:
http://www.baidu.com/link?url=-HcHGJqjJ4zBBpC8yDF8xDh8rD3nAJZjFWsHhEoSNd85PkV8XilztMwa2nH55TjPA9jFOluzcoc81EdaQfqERSO7UK
http://www.baidu.com/link?url=nioJGJqjJ4zBBpC8yDF8xDhitT_bK6lyEGpBb91J2c_mKUBcVWhbfAln_SDt6yG2L5jIR9fsqYtj1UUtOfq
http://www.baidu.com/link?url=iHIyGJqjJ4zBBpC8yDF8xDhitT_bK5lcCmNBcokQ2t3626sxS7gbeeYp2X3l5zLO49yY0lPsaVYs4JVw2aK

互联网文章对二者的区别的表述,都不完整、不准确。

GetKeyState:返回调用此函数时指定按键的状态。"The key status returned from this function changes as a thread reads key messages from its message queue"这句话被误读了,它的意思是说“此函数返回的按键状态在线程从消息队列中读取键盘消息时发生改变”,就是说发生了键盘消息则按键状态会变。但不是说此函数返回的状态是发生键盘消息这一时间点上的按键状态。

GetAsyncKeyState:返回调用此函数时指定按键的状态,或者上次调用此函数后指定按键的状态。“ the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down”这句话也被误读,“currently”是相对于“since the last call”而言的,并不表示“实时”。

也就是说二者在基本功能上是完全相同的,只是Async多判断了前置状态,譬如Ctrl+A,两个键之间可以有时间间隔,至于间隔是多少,LZ没有做实验。从代码角度讲,如果用GetAsyncKeyState,条件语句中要把它放在判断虚拟键码之前,这样Ctrl按下时会调用一次,在A按下时第二次调用,就满足MSDN所描述的场景了。

另外,对于鼠标按键二者的区别,MSDN已解明,互联网文章的理解是正确的,这里就不再赘述了。

以上,仅供参考。
...全文
316 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimette 2013-02-04
  • 打赏
  • 举报
回复
Eleven 2013-02-04
  • 打赏
  • 举报
回复
感谢分享~~
wocow3 2013-02-04
  • 打赏
  • 举报
回复
GetAsyncState获取全局的按键状态 一般UI的按键消息都是靠input queue驱动,所以大多用GetKeySate,从而与input queue产生的消息保持同步 而GetAsyncState是实时状态,时序上理解有可能比GetKeySate超前
wocow3 2013-02-04
  • 打赏
  • 举报
回复
GetKeySate获取input queue的按键状态

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧