我需要提取光标图像以便在我的 swing 应用程序(Java)中使用它。
首先,我发现类似的问题 https://stackoverflow.com/questions/739870/extract-cursor-image-in-java/740528,修改了答案中的代码片段,并得到了这个沙盒应用程序 https://pastebin.com/uDvH3HL7.
很快,它通过 JNA 和 WinAPI 获取光标图像,然后在 JFrame 上显示该图像并为此框架设置自定义光标。
在大多数情况下,此代码可以正常工作并且适合我的任务。但后来我发现当用户更改光标的大小或颜色时(Windows 10 功能 https://pureinfotech.com/change-mouse-pointer-size-windows-10/),程序会提取一个无效的光标图像,该图像在颜色和大小上都不与原始光标匹配。
当用户有标准光标时:
当用户有例如粉色光标比标准光标大:
在这种情况之后,我决定做同样的沙箱应用程序,但通过 C++ 和 WinAPI。我为此使用了答案question https://stackoverflow.com/questions/10469538/winapi-get-mouse-cursor-icon,但仅解决了颜色问题。
我认为主要的瓶颈是GetSystemMetrics
函数返回默认的光标大小(32x32),并且在光标大小改变后它不会改变。我找到了一些证明here https://stackoverflow.com/questions/1699666/how-do-i-know-the-size-of-a-hcursor-object,但我不确定。
所以我的问题是:
如何获取光标的实际大小?
预先非常感谢!
我认为主要瓶颈是 GetSystemMetrics 函数返回
默认光标大小 (32x32),并且在光标移动后不会改变
尺寸变化。
当用户通过设置更改光标大小时。系统设置将将此更改更新为注册表值CursorBaseSize
under HKEY_CURRENT_USER\Control Panel\Cursors
.
当发生变化时,您可以通过以下方式收到通知WM_SETTINGCHANGE https://learn.microsoft.com/en-us/windows/win32/winmsg/wm-settingchange?redirectedfrom=MSDN or SetWinEventHook https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwineventhook (EVENT_OBJECT_SHOW https://learn.microsoft.com/en-us/windows/win32/winauto/event-constants, OBJID_CURSOR https://learn.microsoft.com/en-us/windows/win32/winauto/object-identifiers).
然后阅读CursorBaseSize
注册值以获取新大小并使用获取其他信息GetIconInfoEx https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-geticoninfoexw创建具有指定大小的光标。 (CreateCursor https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createcursor)
更多参考:当光标发生变化时如何收到通知? https://devblogs.microsoft.com/oldnewthing/20151116-00/?p=92091
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)