我正在使用一个应用程序,其中我必须开发的一个选项是更改Windows 10游标大小。在我的情况下,重要的是改变整个窗口的光标大小,而不仅仅是特定的Java应用程序窗口。目前,我可以通过修改HKEY_CURRENT_USER→控制面板→游标目录下的Windows注册表属性来更改特定游标类型的大小。
不幸的是,我需要将光标大小设置为大于32x32px。 在某个地方,我找到了一个解决方案,可以通过位图覆盖现有的鼠标光标,只需按照光标的位置,但我不知道如何开始实现。 我在互联网上搜索过,我发现了一些允许用户修改整个Windows 10光标大小的应用程序 - 例如,这是CursorFX。
你知道如何以编程方式增加光标大小吗?
答案 0 :(得分:2)
您可以使用SetSystemCursor
API设置所需的任何尺寸光标。您不仅限于SM_CXCURSOR
/ SM_CYCURSOR
指标(参见GetSystemMetrics
function) - 这些只是告诉您系统的默认游标大小,通常为32× 32(在高DPI系统上为48×48)。我知道这个事实可以追溯到Windows XP;我很确定它会比那更进一步。
关键在于如何加载游标资源。您可能已经知道,您需要将HCURSOR
对象传递给SetSystemCursor
。在Windows API中,这是一个to-to-cursor游标。加载游标的显而易见的方法是调用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_NORMAL
为32512
。
请注意,我们在这里所做的是加载所需大小的新光标(即图像),然后进行设置。这很好。您不能轻易做的只是扩展现有游标字形的大小。为此,您必须检索当前光标字形,将其绘制到位图上,将该位图缩放到所需大小,将该位图转换为HCURSOR
,然后设置 > HCURSOR
使用SetSystemCursor
。当然,问题是Windows游标字形只是位图,所以它们不是无限可扩展的。您将很快开始失去解决方案,因此不建议这样做。如果您需要大尺寸光标,则需要提供自己的图像。
通过“CursorFX”,我相信你正在考虑AniFX(由同一个人,Attila Kovrig,他写过IcoFX)。这是一个光标图像编辑器,是创建所需* .CUR / * .ANI文件的好方法。但你可以轻松地使用其他一些用于创建游标的软件;有无数可供选择。
__
†由于SetSystemCursor
通过调用SetSystemCursor
来破坏指定的游标,因此您不希望该函数使用DestroyCursor
。在致电LoadCursor
之前,您需要先CopyCursor
然后再SetSystemCursor
。这些都在SetSystemCursor
的文档中详细说明,但正如我所说,您不必再担心这一点,因为您只使用LoadImage
(没有LR_SHARED
标志)。 子>
答案 1 :(得分:0)
不,它不适用于windows 10
,虽然它适用于windows 7
!
我已经实现了这样的功能,一切都在Windows 7上运行。不幸的是,当我检查它在Windows 10上是如何工作的时候,我发现了以下行为:
通常,此功能在Windows 10上不起作用。有时我可以观察到这个光标(当我增加光标大小时)闪烁,其大小与我期望的一样。然后,当我停止增加光标时,它返回到32x32大小。您是否可以在Windows 10上遇到此类问题,并提供一些有用的提示?