【问题标题】:Extract cursor size via WinAPI (Windows 10)通过 WinAPI 提取光标大小 (Windows 10)
【发布时间】:2020-08-06 16:09:05
【问题描述】:

我需要提取光标图像以便在我的 Swing 应用程序 (Java) 中使用它。

首先,我找到了similar question,从一个答案中修改了代码sn-p,得到了这个sandbox application

简而言之,它通过JNA和WinAPI获取光标图像,然后在JFrame上显示该图像并为该帧设置自定义光标。

在大多数情况下,此代码可以正常工作并且适合我的任务。但是后来我发现当用户改变光标的大小或颜色时(Windows 10 feature),程序会提取出一个无效的光标图像,它在颜色和大小上都与原始光标不匹配。

当用户有标准光标时:

当用户有例如粉红色光标然后比标准光标大:

在这种情况下,我决定做同样的沙盒应用程序,但通过 C++ 和 WinAPI。我使用了这个question 的答案,但只解决了颜色问题。

我认为主要的瓶颈是GetSystemMetrics 函数返回默认光标大小(32x32),并且在光标大小改变后它不会改变。我找到了一些证明here,但我不确定。

所以我的问题是:

如何获得光标的实际大小?

提前非常感谢!

【问题讨论】:

  • 这能回答你的问题吗? How to get mouse cursor icon VS c++
  • @ÖöTiib 在我的 cpp 沙箱中我做了同样的事情,但它不处理光标的大小变化。光标始终为 32x32。

标签: java c++ swing winapi windows-10


【解决方案1】:

我认为主要瓶颈是 GetSystemMetrics 函数返回 默认光标大小(32x32)并且在光标移动后不会改变 大小变化。

当用户通过设置更改光标大小时。系统设置会将此更改更新为HKEY_CURRENT_USER\Control Panel\Cursors 下的注册表值CursorBaseSize

您可以通过WM_SETTINGCHANGESetWinEventHookEVENT_OBJECT_SHOWOBJID_CURSOR)在发生更改时收到通知。

然后读取CursorBaseSize寄存器值以获取新大小并使用GetIconInfoEx获取其他信息以创建具有指定大小的游标。 (CreateCursor)

更多参考:How can I get notified when the cursor changes?

【讨论】:

    【解决方案2】:

    感谢@Rita Han - MSFT 提供了开始搜索的起始点。

    您可以通过两种方式获得真正的光标大小:

    1. 第一种方式前面提到过:我们需要从HKEY_CURRENT_USER\Control Panel\Cursors下的注册表值CursorBaseSize中获取值。
    2. 找到了第二种方法here:我们可以通过HKEY_CURRENT_USER\Software\Microsoft\Accessibility下的注册表值CursorSize获取游标大小乘数,然后自己计算游标大小。可以这样完成:newHeight = cursorHeight + (multiplier - 1) * (cursorHeight / 2); 其中cursorHeight 是来自GetSystemMetrics(SM_CYCURSOR) 的值,multiplier 是来自注册表的值。光标实际宽度值将与newHeight 相同。 如果我们使用 C++,所有值都是unsigned long。`

    两种查找尺寸的方法都得出相同的结果。

    如果您需要从注册表中找到获取光标实际大小值在Java中,您可以使用JNA-platform中的Advapi32Util类:

            // Read an int (& 0xFFFFFFFFL for large unsigned int)
            int baseSize = Advapi32Util.registryGetIntValue(
                    WinReg.HKEY_CURRENT_USER, "Control Panel\\Cursors", "CursorBaseSize");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多