您的位置:首页 > 其它

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

2012-08-24 17:55 686 查看
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就会返回。希望这篇文章能帮助需要的人解决问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows null