GetKeyState()和GetAsyncKeyState()的区别

使用::GetKeyState()返回一个short型的数,short型是16位有符号的数据类型,如果要查询的键被按下,返回值最高位被置1,则这个数表示负数,所以可以用<0或>0来判断。

0x8000是16进制数,用2进制表示为1000 0000 0000 0000,&是按位与。同样,如果键被按下,返回值最高位为1,则1xxx xxxx xxxx xxxx & 1000 0000 0000 0000得到的结果为1000 0000 0000 0000,这样可以判断最高位的值。

需要说明的是,::GetKeyState()只能在键盘消息处理程序中使用,因为它只有在线程从消息队列中读取键盘消息时才会报告被查询键的状态,如果需要在键盘消息处理程序以外查询按键状态,则需要使用::GetAsyncKeyState()来代替。

GetKeyState()得到的结果是在获取到当前消息时的键盘上按键状态的一个映像,也就是说,这个状态不会随着按键真实按键状态的改变而改变。其实通常情况下得到这样非实时的结果就足够了。由于只是查表,所以速度较快,但是决不能写出下面的代码

      while(GetKeyState(nVirKey))

      {

            //code here

      }

而要得到某一个键实时的状态,则应该使用GetAsyncKeyState(),这个函数通过查询Driver而得到实时的信息。但是这个函数较GetKeyState慢。

 

SHORT GetKeyState(int nVirtKey);
SHORT GetAsyncKeyState(int vKey);
BOOL GetKeyboardState(PBYTE lpKeyState);

三个取key status的函数的最大区别是:
第一个:是从windows消息队列中取得键盘消息,返回key status.
第二个:是直接侦测键盘的硬件中断,返回key status.
第三个:是当从windows消息队列中移除键盘消息时,才返回key status.
if(GetAsyncKeyState(VK_LSHIFT))
这样写是不对的。
GetAsyncKeyState()的返回值表示两个内容,一个是最高位bit的值,代表这个键是否被按下,一个是最低位bit的值,代表在上次调用GetAsyncKeyState()后,这个键是否被按下。
应该是
if(GetAsyncKeyState(VK_LSHIFT)&0x8000)

个人感觉总是使用::GetAsyncKeyState()就对了

 

本文转自:http://hi.baidu.com/wy_51131/blog/item/29be947fb1217d310dd7da3d.html/cmtid/3d7b037e47446d0329388a42

你可能感兴趣的:(windows)