HWND 鼠标悬停时改变光标

Posted

技术标签:

【中文标题】HWND 鼠标悬停时改变光标【英文标题】:HWND Change cursor when mouse Hover 【发布时间】:2015-09-27 23:28:09 【问题描述】:

当鼠标悬停在某个 HWND 时,我需要更改光标图标。我实现了鼠标光标的变化

SetClassLong(hWindow, GCL_HCURSOR, (LONG)LoadCursor (NULL, IDC_CROSS));

但它会将光标应用于与指定 HWND 共享同一类的每个元素。例如,在我的例子中,HWND 是一个 Button 元素,它的类是“Button”,所以我窗口中的所有按钮都将具有相同的光标。如何将光标更改为指定的 HWND?像这样的:

SetHwndCursor(hWindow, GCL_CURSOR, Cursor); //Invented function, just to make the example

谢谢。

【问题讨论】:

【参考方案1】:

要显示与类的默认光标不同的光标,您需要处理窗口的WM_SETCURSOR 消息并调用SetCursor 以响应WM_SETCURSOR。简要示例,请参阅Displaying a Cursor。

您需要对按钮进行子类化以覆盖按钮的 WndProc 以处理 WM_SETCURSOR。使用SetWindowSubclass 对窗口进行子类化(然后在按钮被销毁时删除使用RemoveWindowSubclass 的子类化,以响应WM_NCDESTROY——详见Raymond Chen 的Safer subclassing)。 SetWindowLongPtr 不再推荐用于子类化窗口。

感谢@IInspectable 和@JonathanPotter 提供有关SetWindowSubclass 的信息。

【讨论】:

Subclassing Controls 描述了使用旧的子类化方法 (SetWindowLongPtr) 的缺点,并解释了正确的方法。 所有现代系统都有 comctl32.dll 版本 6。没有人应该再编写针对 Windows 98 的程序。无论如何,SetWindowSubclass 是在 5.8 中添加的。【参考方案2】:

我通过为有问题的窗口处理WM_SETCURSOR 并使用SetCursor 来完成此操作。

【讨论】:

SetCursor 更改全局光标,而不是本地应用到某个元素,我错了吗?谢谢。 鼠标一移动,它所在的窗口就可以/将设置为它想要的...包括您的应用程序不拥有的窗口。实际上,它只适用于某个元素。

以上是关于HWND 鼠标悬停时改变光标的主要内容,如果未能解决你的问题,请参考以下文章

鼠标悬停时在光标附近显示浮动div,鼠标悬停时隐藏

在 Google Maps V3 API 标记鼠标悬停时获取鼠标光标的位置

当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 c#

需要对图像进行动画处理以在每次鼠标悬停时从光标位置移开?

如何创建 QTableview 单元格悬停功能

当用户将鼠标悬停在滑块上时,使光标成为手