我正在使用一个应用程序,其中我必须开发的选项之一是更改Windows 10光标大小。就我而言,更改整个窗口的光标大小非常重要,而不仅仅是针对特定的 Java 应用程序窗口。目前,我可以通过修改控制面板→游标目录HKEY_CURRENT_USER →下的Windows注册表属性来更改特定游标类型的大小。
不幸的是,我需要将光标大小设置为大于 32x32px。 我在某处找到了一个解决方案,其中可以通过位图覆盖现有的鼠标光标并仅遵循光标的位置,但我不知道如何开始实现。 我在互联网上搜索,发现一些应用程序允许用户修改整个Windows 10的光标大小 - 例如,这是CursorFX。
您知道如何以编程方式增加光标大小吗?
您可以使用SetSystemCursor
API 设置所需的任何大小光标。您不限于SM_CXCURSOR
/SM_CYCURSOR
指标(参见GetSystemMetrics
函数)—这些只是告诉您系统的默认光标大小,通常为 32×32(在高 DPI 系统上为 48×48)。我知道一个事实,这可以追溯到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_*
常量之一来标识要更改的系统游标类型。当您包含Windows.h
时,默认情况下不包括这些;在包含Windows.h
之前,您必须定义OEMRESOURCE
。不过,我假设使用 Java,您只需将常量自己定义为枚举值即可。在这种情况下,它们都可以在 MSDN 文档中找到SetSystemCursor
。例如,OCR_NORMAL
是32512
.
但请注意,我们在这里所做的是加载所需大小的新光标(即图像),然后进行设置。这工作正常。您不能轻易做的只是扩展现有游标字形的大小。为此,您必须检索当前光标字形,将其绘制到位图上,将该位图缩放到所需的大小,将该位图转换为HCURSOR
,然后使用SetSystemCursor
设置该HCURSOR
。当然,问题在于Windows光标字形只是位图,因此它们不是无限可伸缩的。您将很快开始失去分辨率,因此不建议这样做。如果需要大尺寸光标,则需要提供自己的图像。
通过"CursorFX",我相信你会想到AniFX(由编写IcoFX的同一个人Attila Kovrig)。这是一个光标图像编辑器,将是创建 * 的好方法。.CUR/*。您需要的 ANI 文件。但是,您可以轻松地使用其他一些专为创建光标而设计的软件;有无数种可供选择。
__
†并不是说您希望该函数具有SetSystemCursor
,因为SetSystemCursor
通过调用DestroyCursor
来破坏指定的游标。您需要先执行LoadCursor
,然后在调用SetSystemCursor
之前CopyCursor
。这在SetSystemCursor
的文档中都有详细说明,但正如我所说,您不再需要担心这一点,因为您只需使用LoadImage
(没有LR_SHARED
标志)。