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