【问题标题】:Windows cursor size bigger than maximum availableWindows 光标大小大于可用的最大值
【发布时间】:2018-02-11 08:55:37
【问题描述】:

我正在使用一个应用程序,其中我必须开发的选项之一是更改 Windows 10 光标大小。就我而言,更改整个窗口的光标大小很重要,而不仅仅是特定的 java 应用程序窗口。目前,我可以通过在 HKEY_CURRENT_USER → 控制面板 → 光标目录下修改 Windows 注册表属性来更改特定光标类型的大小。

不幸的是,我需要将光标大小设置为大于 32x32px。 在某处我找到了一个解决方案,可以通过位图覆盖现有的鼠标光标并跟随光标的位置,但我不知道如何开始实施。 我在 Internet 上进行了搜索,发现了一些允许用户修改整个 Windows 10 光标大小的应用程序,例如 CursorFX。

您知道如何以编程方式增加光标大小吗?

【问题讨论】:

    标签: java windows winapi cursor


    【解决方案1】:

    您可以使用SetSystemCursor API 设置任何大小的光标。您不仅限于SM_CXCURSOR/SM_CYCURSOR 指标(参见@​​987654322@)——这些指标只是告诉您系统的默认光标大小,通常为 32×32(或 48×48在高 DPI 系统上)。我知道这可以追溯到 Windows XP。我很确定它比那更早。

    关键在于如何加载游标资源。您可能已经知道,您需要一个HCURSOR 对象来传递给SetSystemCursor。在 Windows API 中,这是一个光标句柄。加载游标的明显方法是调用LoadCursor API function,但这是一个非常旧的函数,在 16 位 Windows 中引入,它仅限于加载游标大小为SM_CXCURSOR×SM_CYCURSOR。所以你不想要那个;您想调用LoadImage,正如文档所示,它是现代替换功能。它采用一个枚举整数参数来指示要加载的图像类型:IMAGE_BITMAP (0)、IMAGE_ICON (1)、IMAGE_CURSOR (2) 或 IMAGE_ENHMETAFILE (3)。显然,IMAGE_CURSOR 是你要在这里使用的。

    您可以从嵌入到应用程序二进制文件中的游标资源(作为 Win32 资源)加载,也可以从磁盘中的 *.CUR/*.ANI 文件加载。要执行后者,请将LR_LOADFROMFILE 标志传递给LoadImage 函数。

    我不懂 Java,所以我无法使用任何语法将其翻译成 Java 以进行本机 Windows API 调用,但这里是 C 中的代码:

     // Load from a CUR file, at C:\LargeCursor.cur, with a size of 64x64 pixels
    HCURSOR hCursor = (HCURSOR)LoadImage(NULL,
                                         "C:\\LargeCursor.cur"),
                                         IMAGE_CURSOR,
                                         64, 64,
                                         LR_DEFAULTCOLOR | LR_LOADFROMFILE);
    assert(hCursor != NULL);  // verify that load was successful
    BOOL result = SetSystemCursor(hCursor, OCR_NORMAL);
    assert(result != FALSE);  // verify that the change was successful
    
    // Load from an embedded resource, IDC_CURSOR, with a size of 64x64 pixels
    HCURSOR hCursor = (HCURSOR)LoadImage(GetModuleHandle(NULL),
                                         IDC_CURSOR),
                                         IMAGE_CURSOR,
                                         64, 64,
                                         LR_DEFAULTCOLOR);
    assert(hCursor != NULL);  // verify that load was successful
    BOOL result = SetSystemCursor(hCursor, OCR_NORMAL);
    assert(result != FALSE);  // verify that the change was successful
    

    注意SetSystemCursor 需要OCR_* 常量之一来标识要更改的 系统游标类型。包含Windows.h 时默认不包含这些;您必须定义OEMRESOURCE之前,包括Windows.h。不过,我假设使用 Java,您只是自己将常量定义为枚举值。在这种情况下,它们都可以在the MSDN documentation for SetSystemCursor 中找到。例如,OCR_NORMAL32512

    但请注意,我们在这里所做的是加载所需大小的新光标(即图像),然后进行设置。这很好用。您不能轻易做到的只是扩大现有光标字形的大小。为此,您必须检索当前光标字形,将其绘制到位图上,将该位图缩放到所需大小,将该位图转换为 HCURSOR,然后设置 that @ 987654354@ 使用SetSystemCursor。当然,问题在于 Windows 光标字形只是位图,因此它们不是无限可扩展的。您将很快开始失去分辨率,因此不建议这样做。如果您需要大尺寸光标,则需要提供自己的图像。

    通过“CursorFX”,我相信您想到的是 AniFX(由同一个人 Attila Kovrig 编写,他编写了 IcoFX)。这是一个光标图像编辑器,是创建您需要的 *.CUR/*.ANI 文件的好方法。但是您也可以轻松地使用其他一些专为创建光标而设计的软件;有无数种可供选择。

    __
    并不是你想要 SetSystemCursor 的函数 无论如何,因为 SetSystemCursor 通过调用 DestroyCursor 破坏了指定的游标.在调用SetSystemCursor 之前,您需要先执行LoadCursor,然后再执行CopyCursor。这在SetSystemCursor 的文档中都有详细说明,但正如我所说,您不必再担心这一点,因为您只需使用LoadImage(没有LR_SHARED 标志)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      相关资源
      最近更新 更多