Windows 光标大小大于可用的最大值

问题描述 投票:0回答:1

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

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

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

java windows winapi mouse-cursor
1个回答
5
投票

您可以使用

SetSystemCursor
API 设置您想要的任何大小的光标。您不限于
SM_CXCURSOR
/
SM_CYCURSOR
指标(参见
GetSystemMetrics
函数
)——它们只是告诉您系统的 default 光标大小,通常为 32×32(或 48×48 在高-DPI 系统)。我知道这一事实早在 Windows XP 就可以使用;我很确定它的作用远不止于此。

关键在于你如何加载游标资源。您可能已经知道,您需要一个

HCURSOR
对象来传递给
SetSystemCursor
。在 Windows API 中,这是一个句柄到光标。加载游标的明显方法是调用
LoadCursor
API 函数
,但这是一个 非常 的旧函数,在 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,所以我无法使用调用本地 Windows API 所需的任何语法将其转换为 Java,但这是 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_*
常量来标识 which 系统游标类型更改。当您包含
Windows.h
时,默认情况下不包含这些;你必须定义
OEMRESOURCE
before包括
Windows.h
。不过,我假设对于 Java,您只是将常量自己定义为枚举值。在那种情况下,它们都可以在
SetSystemCursor
的 MSDN 文档中找到。例如,
OCR_NORMAL
32512
.

但是请注意,我们在这里所做的是加载所需大小的新光标(即图像),然后对其进行设置。那很好用。您不能轻易做到的只是扩大existing 光标字形的大小。为此,您必须检索当前光标字形,将其绘制到位图上,将该位图缩放到所需大小,将该位图转换为

HCURSOR
,然后使用 HCURSOR 设置 that
 
SetSystemCursor
 
.而且,自然地,问题是 Windows 光标字形只是位图,因此它们不是无限可扩展的。您将很快开始失去分辨率,因此不建议这样做。如果您需要大尺寸光标,则需要提供您自己的图像。

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

__
并不是说您想要带有

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

© www.soinside.com 2019 - 2024. All rights reserved.