win32中如何区别“鼠标单击”和 “鼠标双击”

今天在编写一个win32的程序时,遇到了一个问题,那就是在我响应鼠标双击这个事件时,先响应了鼠标单击这个事件。于是下决心解决这个问题。后来才明白,鼠标双击是由两次鼠标的单击组成的,只不过windows通过判断两次鼠标单击的时间,如果两次鼠标单击在200ms之内,则说明是鼠标双击事件,如果超过了200ms,则说明是鼠标的两次单机事件。那么如何在响应鼠标双击的同时不响应鼠标单击事件呢?也就是过滤掉鼠标的单击事件。有两种方法可以实现。

 

(1) 在WM_LBUTTONDOWN这个消息响应中加入下面的过滤条件

DWORD st;

DWORD et;

MSG msg;

st = GetTickCount();

while(1)

{

if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))

{

    ::TranslateMessage(&msg);

    ::DisatchMessage(&msg);}

if(WM_LBUTTONDBLCLK == msg.message)

{

  return DefWindowProc(hWnd,message,wParam,lParam);

}

et = GetTickCount();if(et - st > 200)break;}

这样就可以在响应鼠标双击的消息时,不响应鼠标单击的响应。

 

(2) 使用Sleep(GetDoubleClickTime())在WM_LBUTTONDOWN消息响应中加入

static bool flag = FALSE;

Sleep(GetDoubleClickTime());

if(flag){ return 0;}

flag = false;

然后在WM_LBUTTONDBLCLK中加入

flag = true;

这样的目的是:当用户双击鼠标时,先进入的是WM_LBUTTONDOWN这个消息响应,

Sleep(GetDoubleClickTime())后,

消息响应会进入WM_LBUTTONDBLCLK,这个时候flag变成了true,

等sleep结束后,消息继续回到LBUTTONDOWN中,

这个时候判断flag的值是true就会返回。希望这篇文章能帮助需要的人解决问题。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值