我正在使用一个应用程序,其中我必须开发的选项之一是更改Windows 10光标大小。在我的例子中,重要的是改变整个窗口的光标大小,而不仅仅是一个特定的Java应用程序窗口。目前,我可以通过修改HKEY_CURRENT_USER →控制面板→光标目录下的Windows注册表属性来更改特定光标类型的大小。
不幸的是,我需要设置光标大小大于32 x32 px。我在某个地方找到了一个解决方案,其中有可能用位图覆盖现有的鼠标光标,并且只是跟随光标的位置,但我不知道如何开始实现。我在互联网上搜索,我发现一些应用程序,允许用户修改光标的大小为整个Windows 10-例如,这是CursorFX.
你知道如何以编程方式增加光标大小吗?
1条答案
按热度按时间q3qa4bjr1#
您可以使用
SetSystemCursor
API设置任何您想要的光标大小。您不限于SM_CXCURSOR
/SM_CYCURSOR
指标(参见GetSystemMetrics
function)-这些只是告诉你系统的 * 默认 * 光标大小,通常是32×32(或48×48在高DPI系统)。我知道一个事实,这可以追溯到Windows XP;我敢肯定它的工作远不止于此。关键在于如何加载游标资源。您可能已经知道,需要将
HCURSOR
对象传递给SetSystemCursor
。这是一个句柄到光标,在Windows API的发言。加载游标的最明显的方法是调用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代码:
请注意,
SetSystemCursor
需要OCR_*
常量之一来标识要更改的 * 哪个 * 系统游标类型。当包含Windows.h
时,默认情况下不包含这些;你必须在 * 之前定义OEMRESOURCE
*,包括Windows.h
。不过,我假设在Java中,您只是自己将常量定义为枚举值。在这种情况下,它们都可以在the MSDN documentation forSetSystemCursor
中使用。例如,OCR_NORMAL
是32512
。但是请注意,我们在这里所做的是加载一个所需大小的新光标(即图像),然后进行设置。那很好你不能轻易地做的是扩大 * 现有 * 光标标志符号的大小。为此,您必须检索当前光标标志符号,将其绘制到位图上,将该位图缩放到所需的大小,将该位图转换为
HCURSOR
,然后使用SetSystemCursor
设置 thatHCURSOR
。当然,这样做的问题是Windows光标符号只是位图,所以它们不是无限可伸缩的。您将很快开始失去分辨率,因此不建议这样做。如果你需要一个大尺寸的光标,你将需要提供自己的图像。说到“CursorFX”,我相信你想到的是AniFX(作者是同一个人,Attila Kovrig,他写了IcoFX)。这是一个光标图像编辑器,是创建所需的 .CUR/.ANI文件的好方法。但是你也可以很容易地使用其他一些为创建光标而设计的软件;有无数种可供选择。
__
†并不是说你想用
SetSystemCursor
* 反正 *,因为SetSystemCursor
通过调用DestroyCursor
来销毁指定的游标。在调用SetSystemCursor
之前,您需要先执行LoadCursor
,然后执行CopyCursor
。这些都在SetSystemCursor
的文档中详细说明,但正如我所说,您无需再担心这一点,因为您只需使用LoadImage
(不带LR_SHARED
标志)。