在Windows平台上,按下,释放并快速单击鼠标左键两次将生成WM_LBUTTONDOWN,WM_LBUTTONUP和WM_LBUTTONDBLCLK消息,但是Windows根据两次独立的一次单击或双击来区分两个连续的鼠标按钮操作。 ?最近解决问题时,我通过使用Spy ++并咨询MSDN来解决问题。简短的摘要如下:
Windows根据两个条件进行区分:
([1)双击时间间隔
这很容易想到。更准确地说,两次单击将生成四次鼠标单击消息。如果第三条消息(第二次按下)和第二条消息(由第一次弹跳触发的WM_LBUTTONUP)之间的间隔短于“指定值”,则将第三条消息处理为WM_LBUTTONDBLCLK消息;第四条消息仍然是WM_LBUTTONUP。
在Windows XP SP2上,此指定的时间间隔默认为0. 5秒,对于其他操作系统,该时间间隔可能相同。可以通过调用:: GetDoubleClickTime获得该值。
可以设置此值。设置此值的方法有两种::: SetDoubleClickTime调用,或以SPI_SETDOUBLECLICKTIME作为第一个参数的调用:: SystemParametersInfo。设置的结果还会影响系统中的其他应用程序。

([2)两次鼠标单击之间的间隔距离
在第一次单击时,Windows将检测到一个以命中点为中心的矩形区域。如果第二次单击不在此区域之内,则第三条消息将不会计为WM_LBUTTONDBLCLK消息。
在Windows XP SP2上,此矩形区域的默认大小默认为4pt×4pt。您可以使用SM_CXDOUBLECLK或SM_CYDOUBLECLK作为参数调用:: GetSystemMetrics。
此值也可以设置。设置方法是使用SPI_SETDOUBLECLKWIDTH或SPI_SETDOUBLECLKHEIGHT作为第一个参数调用:: SystemParametersInfo。设置的结果还会影响系统中的其他应用程序。
因此,连续两次按下并弹出鼠标左键:
如果不满足以上两个条件,则生成的消息为:

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDOWN
WM_LBUTTONUP
如果满足以上两个条件,则生成的消息为:
WM_LBUTTONDOWN

WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
以上结论还暗示了两个要点:
(1)被计为两次连续单击或两次单击,一、的第二和第四条消息不受影响。在收到双击消息之前,应用程序始终会收到WM_LBUTTONDOWN和首先是WM_LBUTTONUP消息,然后是WM_LBUTTONUP消息,应用程序应适当处理各种消息;
(2)第二条消息和第三条消息是密钥,必须连续发送到同一窗口过程中进行处理。开发中的常见错误是:处理第一条消息WM_LBUTTONDOWN或在WM_LBUTTONUP中,随后的鼠标消息将通过SetCapture捕获并转发到其他窗口,从而导致原始窗口无法识别双击,而这种双击可能是预期的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-359433-1.html
成功了