全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
键盘消息常用获取按键状态的两大函数为GetAsyncKeyState和GetKeyState。使用GetKeyState()返回一个short型的数,short型是16位有符号的数据类型,如果要查询的键被按下,返回值最高位被置1,则这个数表示负数,所以可以用0来判断。另一方面0x8000是16进制数,用2进制表示为1000 0000 0000 0000,&是按位与,同样,如果键被按下,返回值最高位为1,则1xxx xxxx xxxx xxxx & 1000 0000 00000000得到的结果为1,否则为0,同样可以判断最高位的值。两者的区别:1、GetKeyState()只能在键盘消息处理程序中使用,因为它只有在线程从消息队列中读取键盘消息时才会报告被查询键的状态,如果需要在键盘消息处理程序以外查询按键状态,则需要使用:GetAsyncKeyState来代替。2、函数GetKeyState与GetAsyncKeyState函数不同。GetAsyncKeyState在按下某键的同时调用,判断正在按下某键。GetKeyState则在按过某键之后再调用,它返回最近的键盘消息从线程的队列中移出时的键盘状态,判断刚按过了某键。例1 使用后发现两者的区别(以组合键CTRL+A为例): if (nChar =0x041)& (GetKeyState(VK_CONTROL)&0x8000) /ctrl+A /执行相应的操作 的效果是按下CTRL和A,实现指定的操作;(只有先按下CTRL然后按A或者同时按下二者,才能执行指定的操作) 而如果用 if (nChar =0x041)& GetAsyncKeyState(VK_CONTROL) /ctrl+A /执行相应的操作 得到的效果将是:按下CTRL,然后按下A,可以执行指定的操作,但是与上述的区别在于:按下CTRL后隔了一段时间(可能是几秒或更长时间),然后再回过来按A键也会执行指定的操作(这样不是期望的效果)。例2void CMyView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)if (GetKeyState(VK_CONTROL)&0x8000)&(GetKeyState(VK_SHIFT)&0x8000)&(GetKeyState(VK_MENU)&0x8000)AfxMessageBox(你个牛X同时按下了Ctrl+Shift+Alt);CView:OnKeyDown(nChar, nRepCnt, nFlags);2、鼠标消息响应函数:afx_msg void OnMsgName(UINT nFlags, CPoint point)中的nFlags参数,例如onLButtonDown事件中,如果你之前先同时按下Shift和Ctrl,那nflags=0x00D,因MK_LBUTTON:0x001、MK_CONTROL:0x008、WK_SHIFT:0x004。例子:void CMyView:OnLButtonDown(UINT nFlags, CPoint point)/或if (nFlags=0x00D)或 if(nFlags&0x00C)=0x00C)/或if (nFlags=(MK_CONTROL+MK_SHIFT+MK_LBUTTON),或下面那种都可以if(nFlags=(MK_CONTROL|MK_SHIFT|MK_LBUTTON)AfxMessageBox(你个SB同时按下了Ctrl+shift+鼠标左键);CView:OnLButtonDown(nFlags, point);首先说明,有好多程序或书上是0x8000f,这个f不是十六进制的f而是代表浮点数。其实& 8000才是本质。小鱼我整理后自己写了点东西,总结一下首先介绍一下几个概念:按位与运算符&:是双目运算符,其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。例如:0x11 & 0x12(即0001 0001 & 0001 0010)的结果是0x10(0001 0000);(关于vs取反参考附)虚键:指的是非字母可以明确表示的键.(例如ESC BS TAB NumLock 等,虚键列表见附);物理键状态:在操作系统的控制面板中设置鼠标左右键的映射(实际的鼠标左键可以映射成右键点击事件),或者通过程序也可以这样设置,这样就产生了(实际的)物理键状态;逻辑键状态:使用 GetKeyState,GetKeyboardState,等函数得到的逻辑键状态,模拟按下按键;GetAsyncKeyState函数功能:读取的是物理键状态,也是就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。MSDN上给出了例子很恰当For example, the call GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button.也就是说如果你重新设置了映射,GetAsyncKeyState还是只读取物理状态;GetAsyncKeyState的返回值:表示两个内容,一个是最高位bit的值,代表这个键是否被按下,按下为1,抬起为0;一个是最低位bit的值,在windowsCE下要忽略(参考自MSDN If the most significant bit is set, the key is down. The least significant bit is not valid in Windows CE, and should be ignored.)Asynchronous:英文意思是异步的实际当中GetAsyncKeyState的返回值是什么呢?小鱼我写了个程序来获取返回值:#include #include void main()while(1)short a = :GetAsyncKeyState(VK_LSHIFT)printf( 0x%x,a);sleep(10);当然,用MessageBox可以这样写:if(short a = :GetAsyncKeyState(VK_LSHIFT)char buffer30;sprintf(buffer, 0x%x,a);MessageBox(0, buffer, a的值, MB_OK);GetAsyncKeyState按键不按或抬起后不按的返回值0x0 即0000 0000 0000 0000 0000 0000 0000 0000GetAsyncKeyState按键被按下后的返回值 返回0xffff8001 即1111 1111 1111 1111 1000 0000 0000 0001 (这里并不是返回4字节,而是%x打印出32位,前十六位补f)0x8000 即0000 0000 0000 0000 1000 0000 0000 0000GetAsyncKeyState(VK_LSHIFT) & 0x8000 返回0x1 即0000 0000 0000 0000 1000 0000 0000 0000那么为什么GetAsyncKeyState要 与上 0x8000这个常数呢?答案是:获取按键状态,屏蔽掉其他的可能状态,按照MSDN上说低位should ignore。网上有人这样写,意思很明确:#define KEYDOWN(vk_code) (GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define KEYUP(vk_code) (GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)程序应该是:if(GetAsyncKeyState(VK_LSHIFT)&0x8000)对于虚键而言下面这样写逻辑是不对的,虽然结果一样:if(GetAsyncKeyState(VK_LSHIFT)所以让键盘的上下左右出发事件可以这样写:if( :GetAsyncKeyState(VK_LEFT) & 0x8000 )code.if( :GetAsyncKeyState(VK_RIGHT)& 0x8000 )code.if( :GetAsyncKeyState(VK_UP) & 0x8000 )code.if( :GetAsyncKeyState(VK_DOWN) & 0x8000 )code.关于GetAsyncKeyState与GetKeyState区别:GetAsyncKeyState上面已经讲差不多了,关于GetAsyncKeyState与GetKeyState二者最大区别:GetAsyncKeyState在按键不按的情况下为0,而GetKeyState在按键不按的情况下开始为0,当一次按下抬起后变为1,依次循环。SHORT GetKeyState(int nVirtKey / virtual-key code);作用:返回键的状态,按下、释放或锁定(down、up or toggled)参数:虚拟键代码(VK_)。如果是字母a-z、A-Z 或数字0-9, 则为其对应的ASCII码(比如字母O的ASCII码为十六进制的0x4F)返回值:返回码的高位显示当前是否有键被按下,低位(0位)则显示NumLock、CapsLock、ScrollLock的状态(ON或OFF,为ON时键盘指示灯亮)。即高位为1,返回值小于0,说明有键按下;最低位为1表示处于锁定(ON)状态(参考MSDN:If the high-order bit is 1, the key is down; otherwise, it is up.If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle keys indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled. )注:此函数不应该在键盘消息处理程序以外使用,因为它返回的信息只有在键盘消息从消息队列中被检索到之后才有效。若确实需要,请使用GetAsyncKeyState-网上还找到了一些资料:关于和其他的几个函数的区别:SHORT GetKeyState(int nVirtKey);SHORT GetAsyncKeyState(int vKey);BOOL GetKeyboardState(PBYTE lpKeyState);三个取key status的函数的最大区别是:第一个:是从windows消息队列中取得键盘消息,返回key status.第二个:是直接侦测键盘的硬件中断,返回key status.第三个:是当从windows消息队列中移除键盘消息时,才返回key status.keybd_event函数,是模拟键盘击键,一次完整的击键模拟事件,是按下和弹起两个消息,所以 keybd_event(VK_F12,0,0,0);keybd_event(VK_F12,0,KEYEVENTF_KEYUP,0); 完成了一次完整的点击 F12 的事件。GetAsyncKeyState()函数,是直接侦测键盘的硬件中断。(有些人说,是一种“实时性”的侦测,这种说法,感觉不对,比如你调用 Sleep(),就算是中断一年的时间,只要在这期间程序还在运行,它都可以把那个键的状态侦测出来)。自上一次调用GetAsyncKeyState()函数以来(在某些循环中,N次调用GetAsyncKeyState(),它每次检查的,都是自上次调用之后,键的状态),若键已被按过,则返回1,否则,返回0;有些资料显示:倘若输入焦点从属于与调用函数的输入线程不同的另一个线程,则返回零(例如,在另一个程序拥有输入焦点时,应该返回零)。实验证明,这种说法并不完全,函数实际是在大部份范围内工作的,只有少数是另外)。GetKeyState、GetAsyncKeyState、GetKeyboardState函数的区别:1、BOOL GetKeyboardState( PBYTE lpKeyState );获得所有的256个键(键盘按键、鼠标按键等等)的状态,lpKeyState是指向一个256bit的数组,存放所有键的状态。2、SHORT GetAsyncKeyState( int vKey );判断Virtual-KeyCodes为vKey的键是否down或up。用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林护理面试技巧指南
- 护理实习生职业规划指南
- 挖掘AI行业最-佳职业发展路径走进渣打银行的AI面试流程
- 2025年唐山师范学院辅导员考试真题
- 商标审核员案例分析
- 2026年大连沙河口区教育系统招聘教师11人考试历年真题汇编含答案解析(夺冠)
- 2026中国电科36所校园招聘备考题库带答案解析
- 2026浙江宁波市慈溪市招聘高层次和紧缺人才30人备考题库带答案解析
- 商品监督员安全管理竞赛考核试卷含答案
- 井矿盐采卤工安全管理竞赛考核试卷含答案
- 掘进队长考试题库及答案
- 代收个人居间费合同范本
- 知道智慧树西方经济学实验(山东联盟).满分测试答案
- 小区监控改造升级方案(3篇)
- 医院传染病管理培训课件
- 呼吸科护士轮转工作汇报
- 学堂在线 遥测原理 章节测试答案
- 物流器具管理办法
- 云南省高中学业水平考试数学考题分类汇编以及知识点穿插(2025年7月-2026年1月)
- 优先监管地块管理办法
- 减糖与健康:科学控糖指南
评论
0/150
提交评论