使用::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

GetKeyState()和GetAsyncKeyState()的区别相关推荐

  1. GetKeyState和GetAsyncKeyState的区别

    刚接触这个两个函数的时候,我也特别困惑,不知道二者有什么差别,看了msdn之后,也不是很清楚.遍寻web,才略有了解,分享给大家. 简单的说. GetAsyncKeyState就是检查在调用该函数时, ...

  2. GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别:

    GetKeyState.GetAsyncKeyState.GetKeyboardState函数的区别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得所有 ...

  3. GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别 以及虚拟键值

    GetKeyState.GetAsyncKeyState.GetKeyboardState函数的区别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得所有 ...

  4. GetKeyState和GetAsyncKeyState到底有什么区别?

    经常有朋友问起,GetKeyState和GetAsyncKeyState到底有什么区别,分别应该在什么场景下使用. 那么,今天我就来翻译翻译,什么叫惊喜. GetKeyState会返回虚拟按键的状态. ...

  5. 按键判断之GetKeyState 和 GetAsyncKeyState 区别

    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEYUP(vk_code) ( ...

  6. GetKeyState 和 GetAsyncKeyState 区别

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

  7. Windows GetKeyState 和 GetAsyncKeyState 区别

    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEYUP(vk_code) ( ...

  8. Win32 GetKeyState和getasynckeystate

    GetKeyState: 函数功能:该函数检取指定虚拟键的状态.该状态指定此键是UP状态,DOWN状态,还是被触发的(开关每次按下此键时进行切换). 函数原型:SHORT GetKeyState(in ...

  9. c++监听键盘, C++模拟键盘输入

    1.方案1: #include <windows.h> #include <conio.h> #include <iostream>using namespace ...

最新文章

  1. 扩增子统计绘图3热图:样品相关分析,差异OTU/ASV
  2. 什么是动态语言(转)
  3. oracle sql删除job,修改Oracle的Job Scheduler 日志级别及删除运行日志
  4. SAP ERP差异来源和差异处理
  5. 使用模板有什么缺点?如何避免?
  6. Shiro切入Spring的方式
  7. c#图像处理入门(-bitmap类和图像像素值获取方法)
  8. JS生成动态表格并为每个单元格添加单击事件的方法
  9. 聊聊如何提升推荐系统的结果多样性
  10. SpringBoot中注入ApplicationContext对象的三种方式
  11. 我的世界linux服务器乱码,我的世界服务器控制台使用上箭头乱码解决办法
  12. 如何在物联网低代码平台中使用数据字典功能?
  13. 室内设计——别墅设计方案(包含预览图jpg和.psd文件)
  14. Jmeter 接口造数
  15. 关于excel 打开时提示 文件正在使用 正处于锁定状态 正在编辑 的不治本但简单可行的解决办法
  16. c语言编程百分比,c – 计算百分比
  17. 力扣刷题 DAY_63 回溯
  18. 同一个人两次被雷电击中,张益唐攻克世纪难题朗道-西格尔零点猜想?
  19. 安装gin和mod使用
  20. 02自定义面板区附加功能模块及清单编写

热门文章

  1. 使用局域网为手机部署安装包
  2. VDI虚拟桌面基础架构
  3. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(2):Cortex-M3处理器内存模型
  4. java jsf_JSF简单入门
  5. Idea 2021新建项目没有spring选项
  6. Gradle脚本小总结
  7. 【第十三讲】TMS320F28335开发板之DMA模块
  8. 通过溢出码解锁电脑BIOS密码
  9. 数据源SqlDataSource,DetailView,ObjectDataSource控件的配置使用
  10. 用matlab实现熵权法,熵权法原理及matlab代码实现