关键词不能为空

当前您在: 主页 > 英语 >

GetAsyncKeyState和GetKeyState

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-26 13:07
tags:

-

2021年2月26日发(作者:分度值)


键盘消息常用获取按键状态的两大函数为


GetAsyncKeySta te



GetKeyState




使用


GetKeyState()


返回一个


short


型的数,


short


型是


16


位有符号 的数据类型,如果要查询


的键被按下,返回值最高位被置


1


,则这个数表示负数,所以可以用


<0


或< /p>


>0


来判断。



另一


方面


0x8000



16


进制数,



2


进制表示为


1000


0000


0000


0 000



&


是按位与

< br>



同样,


如果键被按下,返回 值最高位为


1


,则


1xxx


xxxx


xxxx


xxxx


&


1000


0000


0000


000 0


得到的结果为


1


,否则为

< p>
0


,同样可以判断最高位的值。



两者的区别:



1



GetKeyState()


只能在键盘消息处理程 序中使用,因为它只有在线程从消息队列中读取键


盘消息时才会报告被查询键的状态,< /p>


如果需要在键盘消息处理程序以外查询按键状态,


则需

< p>
要使用


::GetAsyncKeyState


来 代替。



2



函数


GetKeyState



Get AsyncKeyState


函数不同。


GetAsyncKe yState


在按下某键的


同时调用,


判断正在按下某键。


GetKeyState


则在按过某键之后 再调用,


它返回最近的键盘


消息从


线程


的队列中移出时的键盘状态,判断刚按过了某键。




1



使用 后发现两者的区别(以组合键


CTRL+A


为例)





if (nChar ==0x041)&& (GetKeyState(VK_CONTROL)&0x8000)


//ctrl+A



{



//


执行相应的操作




}



的效果是按下


CTRL


A



实现指定的操作;


(只有先按 下


CTRL


然后按


A

< br>或者同时按下二


者,才能执行指定的操作)




而如果用




if (nChar ==0x041)&& GetAsyncKeyState(VK_CONTROL))


//ctrl+A



{



//


执行相应的操作




}


< p>
得到的效果将是:按下


CTRL


,然后按下


A


,可以执行指定的操作,但是与上述的区别在


于:按下


CTRL


后隔了一段时间(可能是几秒或更长时间)


,然后再回过来按


A


键也会执行


指定的操作(这样不是期望的效果)






2


void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)


{


if


((GetKeyState(VK_CONTROL )&0x8000)&&(GetKeyState(VK_SHIFT)&0x8000)&&(GetKey State(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,



nfl ags==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+M K_SHIFT+MK_LBUTTON)),


或下面那种都可以



if(nFlags==(MK_CONTROL|MK_SHIFT|MK_LBUTTON))


{


AfxMessageBox(

你个


SB


同时按下了


Ctrl+s hift+


鼠标左键



}


CView::OnLButtonDown(nFlags, point);


}






首先说明,有好多程序或书上是


0x 8000f,


这个


f


不是十六进制的< /p>


f


而是代表浮点数。其实


&

< p>
8000


才是本质。小鱼我整理后自己写了点东西,总结一下




首先介绍一下几个概念:



按位与运算 符



:是双目运算符,其功能是参与运算的两数各对应的二进位相 与。只有对


应的两个二进位均为


1


时, 结果位才为


1


,否则为


0

< p>
。参与运算的数以补码方式出现。例


如:


0x11 & 0x12


(即


0001 0001 & 0001 001 0


)的结果是


0x10



0001 0000


);(关于


vs


取反参考附)




虚键:指的 是非字母可以明确表示的键


.


(例如


E SC BS TAB NumLock



,

< br>虚键列表见附);



物理键状态:


在操作系统的控制面板中设置鼠标左右键的映射


(实际的鼠标左键可以映射成


右键点击事件),或者通过程序也可以这样设置,这样就产生了(实际的)物理键状态;



逻辑键状态:使用



GetKeyState,GetKeyboardState,


等函数得到的逻辑键状 态,模拟按下按


键;




GetAsyncKeyState


函数功能:读取的是物理键状态,也是就 是不管你怎么鼠标键盘映射,


它只读取实际的按键状态。


MSD N


上给出了例子很恰当


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 butto n.


也就是


说如果你重新设置了映射,


GetAsyncKeyState


还是只读取物理状态;


< /p>


GetAsyncKeyState


的返回值:表示两个内容,一 个是最高位


bit


的值,代表这个键是否被按

< br>下,按下为


1


,抬起为


0


;一个是最低位


bit


的值,在


windowsCE


下要忽略(参考自


MSDN

-


-


-


-


-


-


-


-



本文更新与2021-02-26 13:07,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/672223.html

GetAsyncKeyState和GetKeyState的相关文章