今天在编写一个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就会返回。希望这篇文章能帮助需要的人解决问题。