虚拟键值转化,为什么 GetKeyState(VK_SHIFT) & 0x8000;
来源:互联网 发布:宗庆后 虚拟经济 知乎 编辑:程序博客网 时间:2024/06/04 18:55
为什么GetAsyncKeyState()& ;
三个概念:
虚键:指的是非字母可以明确表示的键.(例如ESC BS TAB NumLock等,有对应的虚键列表);
逻辑键状态:使用GetKeyState,GetKeyboardState,等函数得到的逻辑键状态,模拟按下按键;
物理键状态:在操作系统的控制面板中设置鼠标左右键的映射(实际的鼠标左键可以映射成右键点击事件),或者通过程序也可以这样设置,这样就产生了(实际的)物理键状态;
GetAsyncKeyState按键不按或抬起后不按的返回值0x0 即00000000 0000 0000 0000 0000 0000 0000
GetAsyncKeyState按键被按下后的返回值 返回0xffff8001即11111111 1111 1111 1000 0000 0000 0001 (这里并不是返回4字节,而是%x打印出32位,前十六位补f)
0x8000 即0000 00000000 0000 1000 0000 0000 0000
GetAsyncKeyState(VK_LSHIFT)& 0x8000 返回0x1 即00000000 0000 0000 1000 0000 0000 0000
那么为什么GetAsyncKeyState要‘与’上 0x8000这个常数呢?
答案是:获取按键状态,屏蔽掉其他的可能状态,按照MSDN上说低位shouldignore。
网上有人这样写,意思很明确:
#defineKEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#defineKEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
程序应该是:
if(GetAsyncKeyState(VK_LSHIFT)&&0x8000)
对于虚键而言下面这样写逻辑是不对的,虽然结果一样:
if(GetAsyncKeyState(VK_LSHIFT))
关于GetAsyncKeyState与GetKeyState二者最大区别:GetAsyncKeyState在按键不按的情况下为0,而GetKeyState在按键不按的情况下开始为0,当一次‘按下抬起’后变为1,依次循环。
两个函数的比较:
GetAsyncKeyState函数功能:读取的是物理键状态,也是就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。MSDN上给出了例子很恰当Forexample, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of theleft physical mouse button, regardless of whether it is mapped to the left orright logical mouse button.也就是说如果你重新设置了映射,GetAsyncKeyState还是只读取物理状态;
GetAsyncKeyState的返回值:表示两个内容,一个是最高位bit的值,代表这个键是否被按下,按下为1,抬起为0;一个是最低位bit的值,在windowsCE下要忽略(参考自MSDNIfthe most significant bit is set, the key is down. The least significant bit isnot valid in Windows CE, and should be ignored.)
Asynchronous:英文意思是异步的
SHORT GetKeyState(intnVirtKey // virtual-key code); 作用:返回键的状态,按下、释放或锁定(down、up ortoggled) 参数:虚拟键代码(VK_)。
如果是字母a-z、A-Z 或数字0-9,则为其对应的ASCII码(比如字母O的ASCII码为十六进制的0x4F)
返回值:返回码的高位显示当前是否有键被按下,低位(0位)则显示NumLock、CapsLock、ScrollLock的状态(ON或OFF,为ON时键盘指示灯亮)。即高位为1,返回值小于0,说明有键按下;最低位为1表示处于锁定
注:此函数不应该在键盘消息处理程序以外使用,因为它返回的信息只有在键盘消息从消息队列中被检索到之后才有效。若确实需要,请使用GetAsyncKeyState
关于以下三个函数的消息来源:
SHORTGetKeyState(int nVirtKey);
SHORTGetAsyncKeyState(int vKey);
BOOLGetKeyboardState(PBYTE lpKeyState);
三个取keystatus的函数的最大区别是:
第一个:是从windows消息队列中取得键盘消息,返回keystatus.
第二个:是直接侦测键盘的硬件中断,返回keystatus.
第三个:是当从windows消息队列中移除键盘消息时,才返回keystatus.
- 虚拟键值转化,为什么 GetKeyState(VK_SHIFT) & 0x8000;
- 0x8000 & GetKeyState(VK_SHIFT); 判断是否有按下shift键
- GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别 以及虚拟键值
- GetAsyncKeyState()& 0x8000 是什么意思
- GetKeyState
- 键盘虚拟键值编码表 使用keybd_Event 以及虚拟按键与扫描码相互转化函数MapVirtualKey
- 虚拟键值表
- 虚拟键值表
- 虚拟键值表【转】
- 虚拟键值表
- 虚拟键值表
- windows 虚拟键值
- 虚拟键值表
- 虚拟键值表
- delphi虚拟键值
- 虚拟键值对应
- 虚拟键值表
- 键盘虚拟键值表
- 我就是要用MD5!不用不行!那么,怎么防止被拖库后泄露用户密码?
- chrome设置
- 操作jQuery集合——过滤操作
- Node.JS 学习路线图
- MR源码学习(二)
- 虚拟键值转化,为什么 GetKeyState(VK_SHIFT) & 0x8000;
- lua字符串截取
- echarts柱状图线形图例子
- Spring定时任务的几种实现
- poj3662
- InputMethodService详解
- 图解linux中 vi 编辑器的工作方式
- 读 非科班出身的人学习编程不负责任指南
- mac安装hbase伪分布式