如何检查鼠标是不是在控件上

Posted

技术标签:

【中文标题】如何检查鼠标是不是在控件上【英文标题】:How to check if a mouse is over a control如何检查鼠标是否在控件上 【发布时间】:2011-05-28 13:45:10 【问题描述】:

如何检查鼠标是否在某个 HWND 上?我曾尝试使用 WM_MOUSELEAVE 和 WM_MOUSEMOVE 消息来跟踪,但是如果您单击一个按钮并将鼠标拖出按钮,它不会收到 WM_MOUSELEAVE 直到释放鼠标,这为时已晚,因为:

当您单击按钮时,仅在以下情况下才会发送 WM_COMMAND 消息: 1.鼠标原本是压在按钮上的 2.鼠标悬停在按钮上 3.鼠标悬停在按钮上

我需要复制这个功能。

【问题讨论】:

【参考方案1】:

要复制此功能,只需调用SetCapture(),这样即使鼠标离开窗口,鼠标消息也会发送到您的窗口。您可以在鼠标移动时读取当前鼠标位置,并确定它是否仍在您的窗口/按钮上方(我仍然不能 100% 确定您在做什么)。并且,当释放鼠标按钮时,您可以调用ReleaseCapture() 来恢复鼠标消息的发送位置。

编辑:哦,您可以使用 Windows API 函数WindowFromPoint() 来确定鼠标在哪个窗口上。

【讨论】:

setCapture 不是一个有效的解决方案,因为需要同时知道多个按钮。我也很确定 SetCapture 不是 Button 类的 WndProc 的方式,这是我需要模拟的。 嗯,它是有效的,即使由于您没有提到的限制,它在您的情况下不起作用。哦,我可以向您保证,Windows 按钮控件使用 SetCapture()。我已经多次复制了这个功能。 @Jonathan,谢谢,请查看我对 Hans Passant 的问题。 @John:Windows 不支持同时选择多个按钮。我再次保证 Windows 按钮使用 SetCapture()。这就是他们知道在按住鼠标按钮时鼠标移过按钮和离开按钮时重绘自己的方式。 如果你有两个按钮,你在哪一个上调用 SetCapture?原谅我的无知。【参考方案2】:

这是 Windows 内置的,称为“鼠标捕获”,SetCapture(hWnd)。即使鼠标移出窗口,它也能确保您收到鼠标消息。您在 WM_LBUTTONDOWN 消息通知上调用它。

【讨论】:

我不在乎是否在窗口外收到鼠标消息。 如果您不关心按钮向上消息,请不要调用 SetCapture()。奇怪的是,显示不再按下的按钮往往很重要。类库往往会毫不费力地解决这个问题。甚至本机 Windows BUTTON 类也会这样做。 @Hans 所以 BUTTON 使用 SetCapture?多个按钮如何同时工作? 不太确定,您是否有一个 UI 示例可以让您同时单击多个按钮? SetCapture 采用 HWND。如果必须指定一个 HWND,多个按钮如何同时起作用?

以上是关于如何检查鼠标是不是在控件上的主要内容,如果未能解决你的问题,请参考以下文章

如何检查鼠标光标是不是在 Javafx 中的按钮上?

如何引导鼠标滚轮输入在光标下控制而不是聚焦?

WPF TabControl 如何在鼠标向上而不是鼠标向下更改选项卡?

C#WinForm中如何判断鼠标是不是在某个控件以外按下

c# 如何检测鼠标是不是按下

如何在某个控件上获取鼠标位置