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

Java Windows光标大小大于可用的最大值,java,windows,winapi,cursor,Java,Windows,Winapi,Cursor,我正在使用一个应用程序,其中我必须开发的一个选项是更改Windows10的光标大小。在我的例子中,重要的是为整个窗口更改光标大小,而不仅仅是为特定的java应用程序窗口。目前,我可以通过修改HKEY_CURRENT_USER下的Windows注册表属性来更改特定光标类型的大小→ 控制面板→ 游标目录 不幸的是,我需要将光标大小设置为大于32x32px。 在某个地方,我找到了一个解决方案,可以用位图覆盖现有的鼠标光标,只跟踪光标的位置,但我不知道如何开始实现。 我在互联网上搜索,发现一些应用程序允

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

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


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

您可以使用。您不局限于
SM\u CXCURSOR
/
SM\u CYCURSOR
metrics(cf.)——它们只告诉您系统的默认光标大小,通常为32×32(或在高DPI系统上为48×48)。我知道一个事实,这项工作可以追溯到WindowsXP;我敢肯定它比那更有效

关键在于如何加载游标资源。您可能已经知道,您需要一个
HCURSOR
对象来传递给
SetSystemCursor
。这是一个指向光标的句柄,在WindowsAPI中。加载游标的明显方法是调用,但这是一个非常古老的函数,由16位窗口引入,它仅限于加载大小为
SM\u CXCURSOR
×
SM\u CYCURSOR
的游标。所以你不想这样†;您需要调用,正如文档所示,这是现代的替换功能。它采用枚举整数参数,指示要加载的图像类型:
image\u位图(0)、
image\u图标(1)、
image\u光标(2)或
image\u图元文件(3)。显然,
IMAGE\u CURSOR
是您想要在这里使用的

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

我不懂Java,所以我无法将其转换为Java,无论需要什么语法来进行本机Windows API调用,但下面是C语言的代码:

//从CUR文件加载,位于C:\LargeCursor.CUR,大小为64x64像素
HCURSOR HCURSOR=(HCURSOR)LoadImage(空,
“C:\\LargeCursor.cur”),
图像光标,
64, 64,
LR_DEFAULTCOLOR | LR_LOADFROMFILE);
断言(hCursor!=NULL);//验证加载是否成功
BOOL结果=设置系统光标(hCursor、OCR\U NORMAL);
断言(结果!=FALSE);//验证更改是否成功
//从嵌入式资源加载,IDC\u游标,大小为64x64像素
HCURSOR HCURSOR=(HCURSOR)LoadImage(GetModuleHandle(NULL),
IDC_光标),
图像光标,
64, 64,
LR_(默认颜色);
断言(hCursor!=NULL);//验证加载是否成功
BOOL结果=设置系统光标(hCursor、OCR\U NORMAL);
断言(结果!=FALSE);//验证更改是否成功
请注意,
SetSystemCursor
需要一个
OCR.*
常量来标识要更改的系统光标类型。当您包括
Windows.h
时,默认情况下不包括这些文件;在包含
Windows.h
之前,必须定义
OEMRESOURCE
。不过,我假设,在Java中,您只是将常量自己定义为枚举值。在这种情况下,他们都可以在。例如,
OCR\u NORMAL
32512

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

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

__
†无论如何,您并不希望该函数与
SetSystemCursor
一起使用,因为
SetSystemCursor
通过调用
destrouccursor
来销毁指定的光标。在调用
SetSystemCursor
之前,您需要先执行
LoadCursor
,然后执行
CopyCursor
。这在
SetSystemCursor
的文档中都有详细说明,但正如我所说的,您不必再担心这个问题,因为您只需使用
LoadImage
(没有
LR\u SHARED
标志)