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

Rob*_*cki 4 java windows winapi mouse-cursor

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

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

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

Cod*_*ray 5

SetSystemCursor您可以使用API设置任意大小的光标。您不受SM_CXCURSOR/SM_CYCURSOR指标(参见GetSystemMetricsfunction)的限制 - 这些指标只是告诉您系统的默认光标大小,通常为 32×32(或在高 DPI 系统上为 48×48)。我知道这个功能早在 Windows XP 就可以使用;我很确定它的工作原理比这更早。

\n\n

关键在于如何加载游标资源。您可能已经知道,您需要一个HCURSOR对象来传递给SetSystemCursor. 用 Windows API 来说,这是一个句柄到光标。加载游标的明显方法是调用LoadCursorAPI 函数,但这是一个非常古老的函数,是在 16 位 Windows 中引入的,并且仅限SM_CXCURSOR于加载大小为×的游标SM_CYCURSOR。所以你不想要\xe2\x80\xa0;您想要调用LoadImage,正如文档所示,这是现代的替换函数。它采用一个枚举整数参数来指示要加载的图像类型:IMAGE_BITMAP(0)、IMAGE_ICON(1)、IMAGE_CURSOR(2) 或IMAGE_ENHMETAFILE(3)。明显地,IMAGE_CURSOR这就是您想要在这里使用的。

\n\n

您可以从嵌入到应用程序二进制文件中的游标资源(作为 Win32 资源)加载,也可以从磁盘上的 *.CUR/*.ANI 文件加载。要执行后者,请将LR_LOADFROMFILE标志传递给LoadImage函数。

\n\n

我不懂 Java,所以我无法使用进行本机 Windows API 调用所需的任何语法将其转换为 Java,但这里是 C 语言的代码:

\n\n\n\n
 // Load from a CUR file, at C:\\LargeCursor.cur, with a size of 64x64 pixels\nHCURSOR hCursor = (HCURSOR)LoadImage(NULL,\n                                     "C:\\\\LargeCursor.cur"),\n                                     IMAGE_CURSOR,\n                                     64, 64,\n                                     LR_DEFAULTCOLOR | LR_LOADFROMFILE);\nassert(hCursor != NULL);  // verify that load was successful\nBOOL result = SetSystemCursor(hCursor, OCR_NORMAL);\nassert(result != FALSE);  // verify that the change was successful\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n
// Load from an embedded resource, IDC_CURSOR, with a size of 64x64 pixels\nHCURSOR hCursor = (HCURSOR)LoadImage(GetModuleHandle(NULL),\n                                     IDC_CURSOR),\n                                     IMAGE_CURSOR,\n                                     64, 64,\n                                     LR_DEFAULTCOLOR);\nassert(hCursor != NULL);  // verify that load was successful\nBOOL result = SetSystemCursor(hCursor, OCR_NORMAL);\nassert(result != FALSE);  // verify that the change was successful\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,SetSystemCursor需要一个常量OCR_*来标识更改的系统游标类型。Windows.h当您包含;时,默认情况下不包含这些内容。你必须在包含OEMRESOURCE 之前Windows.h定义。不过,我假设使用 Java,您只需将常量自己定义为枚举值。在这种情况下,它们都可以SetSystemCursor. 例如,OCR_NORMAL32512

\n\n

但请注意,我们在这里所做的是加载所需大小的新光标(即图像),然后进行设置。效果很好。您不能轻易做的只是扩大现有光标字形的大小。为此,您必须检索当前光标字形,将其绘制到位图上,将该位图缩放到所需的大小,将该位图转换为HCURSOR,然后使用 HCURSOR进行设置SetSystemCursor。当然,问题是 Windows 光标字形只是位图,因此它们不能无限扩展。您将很快开始失去分辨率,因此不建议这样做。如果您需要大尺寸光标,则需要提供自己的图像。

\n\n

说到“CursorFX”,我相信您会想到 AniFX(作者是 Attila Kovrig,IcoFX 的作者)。这是一个光标图像编辑器,是创建您需要的 *.CUR/*.ANI 文件的好方法。但是您也可以轻松地使用其他一些专为创建光标而设计的软件;有无数可供选择。

\n\n

__
\n \xe2\x80\xa0并不是SetSystemCursor ​​您想要使用该函数,因为SetSystemCursor通过调用 会破坏指定的光标DestroyCursor。您需要在致电之前执行LoadCursorthen操作。这在 的文档中都有详细说明,但正如我所说,您无需再担心这一点,因为您只需使用(不带标志)。CopyCursorSetSystemCursorSetSystemCursorLoadImageLR_SHARED

\n