Windows游标大小大于可用的最大值

时间:2017-09-02 14:18:18

标签: java windows winapi cursor

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

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

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

2 个答案:

答案 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_NORMAL32512

请注意,我们在这里所做的是加载所需大小的新光标(即图像),然后进行设置。这很好。您不能轻易做的只是扩展现有游标字形的大小。为此,您必须检索当前光标字形,将其绘制到位图上,将该位图缩放到所需大小,将该位图转换为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上遇到此类问题,并提供一些有用的提示?