拦截单击或双击鼠标 - 双击时只执行双击代码

Ton*_*ion 7 vb.net wndproc mouseevent mouseclick-event winforms

我有一种情况,我在表单上处理单击和双击鼠标事件.在这两种情况下都必须加载某些内容,但是当发生双击时,我不希望执行附加到单击事件的代码.

有没有办法拦截鼠标点击并检查是否双重或单一,然后适当地执行正确的事件?

也许通过拦截窗户的WndProc或什么?

Cod*_*ray 6

不,除非你有时间机器,否则这几乎是不可能的.一旦你理解了Windows如何区分双击和单击,它甚至都没有意义.

事实证明,Raymond Chen(Windows Shell团队的开发人员)在一篇名为" Windows将单击点击转换为双击 "的逻辑结果的博客文章中解释了这一点.

具体来说,Windows只知道将某些内容解释为双击,因为在该函数指定的时间间隔内发生了第二次单击.因为它需要透视(正如雷蒙德雄辩地说的那样)提前确定是否会出现单击或双击,窗口管理器会在收到第一次点击后立即发送消息.只有在确认第二次单击实际表示双击后,才会在稍后发送该消息.结果是您的应用程序将始终收到每条收到的消息的两条消息.GetDoubleClickTimeWM_LBUTTONDOWNWM_LBUTTONDBLCLK WM_LBUTTONDOWNWM_LBUTTONDBLCLK

现在,.NET Framework设计人员了解此过程的工作原理并设计相应引发的事件.当然,他们无法对双击前总是发生的单击做任何事情,但是如果确定用户希望成为双击事件的一部分,他们就能够禁止第二次点击消息.由于Control.MouseClick事件的文档(大致对应于WM_LBUTTONDOWN消息)告诉我们:

如用户操作系统的鼠标设置所确定的那样,在时间上足够接近的两次单击将生成MouseDoubleClick事件而不是第二个MouseClick事件.

然而,Raymond在上面链接的博客文章确实为那些坚持设计的应用程序和开发人员提出了一种可行的解决方法,其中双击操作与单击操作无关(尽管我们都不建议您实际执行此操作):

现在假设您是一个程序,但仍希望继续使用双击操作与单击操作无关的可疑设计.你是做什么?

好吧,你可以做的一件事就是在收到WM_LBUTTONDOWN消息时什么都不做,除了设置一个以GetDoubleClickTime()毫秒为单位的计时器.[已修正上午10点.]如果您WM_LBUTTONDBLCLK在该时间内收到消息,那么毕竟是双击.如果不这样做,则必须单击一下,这样您就可以进行单击操作(虽然有点晚).