-
键盘消息常用获取按键状态的两大函数为
GetAsyncKeySta
te
和
GetKeyState
。
p>
使用
GetKeyState()
返回一个
short
型的数,
short
型是
16
位有符号
的数据类型,如果要查询
的键被按下,返回值最高位被置
1
p>
,则这个数表示负数,所以可以用
<0
或<
/p>
>0
来判断。
另一
方面
0x8000
是
16
进制数,
用
2
进制表示为
1000
0000
0000
0
000
,
&
是按位与
< br>
,
同样,
如果键被按下,返回
值最高位为
1
,则
1xxx
xxxx
xxxx
xxxx
&
1000
0000
0000
000
0
得到的结果为
1
,否则为
0
,同样可以判断最高位的值。
两者的区别:
1
、
GetKeyState()
只能在键盘消息处理程
序中使用,因为它只有在线程从消息队列中读取键
盘消息时才会报告被查询键的状态,<
/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
{
//
执行相应的操作
}
得到的效果将是:按下
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
而是代表浮点数。其实
&
8000
才是本质。小鱼我整理后自己写了点东西,总结一下
首先介绍一下几个概念:
按位与运算
符
:是双目运算符,其功能是参与运算的两数各对应的二进位相
与。只有对
应的两个二进位均为
1
时,
结果位才为
1
,否则为
0
。参与运算的数以补码方式出现。例
如:
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