如何在 Win32 中读取鼠标的外观(指针、调整大小等)

Posted

技术标签:

【中文标题】如何在 Win32 中读取鼠标的外观(指针、调整大小等)【英文标题】:How to read the mouse's appearance (pointer, resizing etc) in Win32 【发布时间】:2020-10-04 20:01:17 【问题描述】:

有没有办法测量当前鼠标图像是否显示它处于调整大小模式?

我正在创建一个水平滑块,它只是一个子类静态(标签)。当用户将鼠标光标悬停在滑块(静态控件)上并单击并按住鼠标左键(wm_lbuttondown)时,我调用了 Window 的 setcapture 函数。然后,当用户释放鼠标按钮 (wm_lbuttonup) 时,我调用 releasecapture。我的子类静态控制过程称为 onevent_label。 WndProc 处理其他所有的消息。

滑块效果很好,除非您完成一张幻灯片然后立即单击鼠标以启动第二张幻灯片,而无需先将鼠标移动到不同的区域或在另一个控件上单击鼠标。

我确定问题是由于第二次单击 wm_lbuttondown 事件在 wndproc(而不是 onevent_label)中触发。鼠标图像似乎一直处于调整大小模式,但是,我在 wndproc 的 wm_lbuttondown 过程中测量鼠标位置,发现它位于我的静态标签控件滑块左侧一个像素。

一个简单的解决方法是简单地将 wm_lbuttondown 消息发送到静态控件,但是,我想让 wndproc 的 wm_lbuttondown 过程智能并且只在适当的时候转发消息。

我认为最好的方法是检查 Windows 是否仍然显示鼠标处于调整大小模式以及光标位置是否合理地接近静态标签。

我似乎无法找到一种方法来衡量鼠标的图像是指针(通常情况)还是显示它正在调整控件的大小(左右水平箭头)。

B 计划仅在鼠标位置在滑块的一到两个像素内时才转发消息。在一个完美的世界中,我想知道鼠标显示水平调整大小的图像并且在滑块的一两个像素内。

想法?评论?有没有办法让我确定鼠标是否正在显示其水平调整大小的图像?

提前致谢。

【问题讨论】:

谁设置鼠标图像显示为resize模式?如果它超出了窗口的边界,那么其他人可能会在该点捕获鼠标。您可以通过GetCapture docs.microsoft.com/en-us/windows/win32/api/winuser/… 进行检查 我意识到我在使用完光标后没有重置光标(到 IDC_ARROW)为自己制造了这个问题。仅供其他偶然发现此问题的人使用:我使用 gcl_hcursor 和 idc_sizewe 将光标更改为水平调整大小,而忽略了使用 gcl_hcursor 和 idc_arrow 进行重置。对于垂直滑块,使用 idc_sizens 并重置为 idc_arrow。 【参考方案1】:

回复: Is there a way for me to determine if the mouse is displaying its horizontal resize image? - 您可以这样做:

HCURSOR h = LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE));
CURSORINFO ci = sizeof CURSORINFO ;
GetCursorInfo(&ci);

并将hci.hCursor 进行比较。这里列出了所有标准游标:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadcursora

【讨论】:

以上是关于如何在 Win32 中读取鼠标的外观(指针、调整大小等)的主要内容,如果未能解决你的问题,请参考以下文章

苹果系统如何设置鼠标指针的大小?

如何使Mac上的鼠标指针更大?

网页中如何让鼠标指针变成小手状

win10怎么使用苹果鼠标

如何从 Perl 完全改变 Win32 标题栏的外观?

如何在 Win32 控制台中隐藏鼠标光标?