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

zbq4xfa0  于 2023-05-19  发布在  Windows
关注(0)|答案(1)|浏览(95)

我正在使用一个应用程序,其中我必须开发的选项之一是更改Windows 10光标大小。在我的例子中,重要的是改变整个窗口的光标大小,而不仅仅是一个特定的Java应用程序窗口。目前,我可以通过修改HKEY_CURRENT_USER →控制面板→光标目录下的Windows注册表属性来更改特定光标类型的大小。
不幸的是,我需要设置光标大小大于32 x32 px。我在某个地方找到了一个解决方案,其中有可能用位图覆盖现有的鼠标光标,并且只是跟随光标的位置,但我不知道如何开始实现。我在互联网上搜索,我发现一些应用程序,允许用户修改光标的大小为整个Windows 10-例如,这是CursorFX.
你知道如何以编程方式增加光标大小吗?

q3qa4bjr

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代码:

// 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,然后使用SetSystemCursor设置 thatHCURSOR。当然,这样做的问题是Windows光标符号只是位图,所以它们不是无限可伸缩的。您将很快开始失去分辨率,因此不建议这样做。如果你需要一个大尺寸的光标,你将需要提供自己的图像。
说到“CursorFX”,我相信你想到的是AniFX(作者是同一个人,Attila Kovrig,他写了IcoFX)。这是一个光标图像编辑器,是创建所需的 .CUR/.ANI文件的好方法。但是你也可以很容易地使用其他一些为创建光标而设计的软件;有无数种可供选择。
__
†并不是说你想用SetSystemCursor * 反正 *,因为SetSystemCursor通过调用DestroyCursor来销毁指定的游标。在调用SetSystemCursor之前,您需要先执行LoadCursor,然后执行CopyCursor。这些都在SetSystemCursor的文档中详细说明,但正如我所说,您无需再担心这一点,因为您只需使用LoadImage(不带LR_SHARED标志)。

相关问题