vb.net - 拦截鼠标单击或双击 - 仅在双击时执行双击代码

标签 vb.net winforms mouseevent wndproc mouseclick-event

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

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

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

最佳答案

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

事实证明,Raymond Chen(Windows Shell 团队的一名开发人员)在一篇名为“Logical consequences of the way Windows converts single-clicks into double-clicks”的博客文章中准确地解释了这一点。

具体来说,Windows 只知道将某些内容解释为双击,因为在 GetDoubleClickTime function 指定的时间间隔内发生了第二次单击。因为它需要千里眼(正如 Raymond Eloquent 地指​​出的那样)来提前确定是单击还是双击,所以窗口管理器会继续并在收到第一次单击后立即发送 WM_LBUTTONDOWN message WM_LBUTTONDBLCLK message 仅在稍后发送,在确认第二次单击实际上代表双击之后。结果是您的应用程序将始终为收到的每个 WM_LBUTTONDOWN 消息接收两个 WM_LBUTTONDBLCLK 消息。

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

Two single clicks that occur close enough in time, as determined by the mouse settings of the user's operating system, will generate a MouseDoubleClick event instead of the second MouseClick event.



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

Now suppose you're a program that nevertheless wants to continue with the dubious design of having the double-click action be unrelated to the single-click action. What do you do?

Well, one thing you could do is to do nothing on receipt of the WM_LBUTTONDOWN message aside from set a timer to fire in GetDoubleClickTime() milliseconds. [Corrected 10am.] If you get a WM_LBUTTONDBLCLK message within that time, then it was a double-click after all. If you don't, then it must have been a single-click, so you can do your single-click action (although a bit late).

关于vb.net - 拦截鼠标单击或双击 - 仅在双击时执行双击代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4814628/

相关文章:

c# - DataGridView 将列中的所有值写入列表

javascript - 使悬停菜单适用于移动设备的最佳实践方法是什么?

c# - 如何在 <button/> 上使用 mouseDown 和 mouseUp

jquery 如何切换鼠标输入或悬停?

c# - WPF 基础知识?

c# - 背景 html CHM

c# - 调整大小后渲染到纹理失败

vb.net - 用于 KML 的 Linq 到 XML?

vb.net - 等待多个Backgroundworkers完成

c# - Winforms WPF 互操作性能