键盘钩子中如何判断一个按键是按下或是抬起?

信阳毛尖 2010-07-28 05:17:41
比如一个监视键盘enter键的键盘钩子,当按的键是enter键并且enter键正在抬起时,进行某些操作,判断条件写为:

if ((wParam == VK_RETURN) && lParam<0)
{
........
........
}
对吗?

我查了些资料,资料上说:
lParam的最高位(0x80000000)则表示了当前这个键是否被按下,如果这个位正在被按下,这个位就是0,反之为1。所以lParam >= 0的意思就是在WM_KEYDOWN的时候“如何如何”,也就是说,如果去掉这个条件,“如何如何”将会被调用两次(连同WM_KEYUP的一次)。

按照资料上说的,应该是这样的吧,除非资料写错了。可是更头疼的是,测试的时候“如何如何”一会儿执行三次,一会儿执行两次的!(执行两次还可以理解,大不了是if写错了;可这执行三次是怎么回事啊?)
...全文
1152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 castlater 的回复:]
如果手按个不停的话,按下消息会每隔一段时间就触发一次,一会是3,一会是2,应该和你按键的时间长短有关
[/Quote]
可是我的判断条件是按键抬起的时候出发呀
baixuesong99 2010-07-30
  • 打赏
  • 举报
回复

LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam)
{
if ( !(lParam & 0X80000000) && HC_ACTION == code )
{
if ( wParam == VK_RETURN )
{
//......
}
}
return 0;
}
wltg2001 2010-07-29
  • 打赏
  • 举报
回复
if ((wParam == VK_RETURN) && lParam<0)
=============
第一次看到将lParam<0作为判断条件的。
MSDN上对lParam说得很清楚:
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
31
Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.
所以你应该将lParam&0x800000,如果结果是1,表示是被释放的,也就是抬起的。
castlater 2010-07-29
  • 打赏
  • 举报
回复
如果手按个不停的话,按下消息会每隔一段时间就触发一次,一会是3,一会是2,应该和你按键的时间长短有关
信阳毛尖 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wltg2001 的回复:]
if ((wParam == VK_RETURN) && lParam<0)
=============
第一次看到将lParam<0作为判断条件的。
MSDN上对lParam说得很清楚:
30
Specifies the previous key state. The value is 1 if the key is down before the message is……
[/Quote]

还是不行呢,依旧是一会儿执行三次,一会儿执行两次的
fishion 2010-07-29
  • 打赏
  • 举报
回复
if (lParam & 0x80000000)?
duke56 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fishion 的回复:]
if ( KF_UP & ( lParam >> 16 ) ){
}
[/Quote]

位移再判断一下就可以了,具体那一位是键盘的状态记不大清楚了^_^
fishion 2010-07-28
  • 打赏
  • 举报
回复
if ( KF_UP & ( lParam >> 16 ) ){
}
Eleven 2010-07-28
  • 打赏
  • 举报
回复
if(GetKeyState(VK_RETURN) < 0)
{

}
sunyouhao 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lsq19871207 的回复:]

引用 1 楼 sunyouhao 的回复:
GetKeyState

能具体点儿不?谢谢.....
[/Quote]
if(GetKeyState(VK_CONTROL) & 0x8000)
{
// 表示 ctrl 键按下了,其他同理
}
信阳毛尖 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunyouhao 的回复:]
GetKeyState
[/Quote]
能具体点儿不?谢谢.....
sunyouhao 2010-07-28
  • 打赏
  • 举报
回复
GetKeyState

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧