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

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

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

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

您可以使用SetSystemCursor API设置您想要的任何大小的光标。 您不限于SM_CXCURSOR / SM_CYCURSOR度量(参见GetSystemMetrics函数 ) – 只是告诉您系统的默认光标大小,通常为32×32(或高DPI系统上的48×48)。 我知道一个事实,这可以在Windows XP的早期工作; 我非常肯定它比这更进一步。

关键在于你如何加载游标资源。 正如你可能已经知道的,你需要一个HCURSOR对象传递给SetSystemCursor 。 这是一个句柄到光标,在Windows API中讲。 加载游标的显而易见的方法是调用LoadCursor API函数 ,但这是一个非常旧的函数,在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(GetmoduleeHandle(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时,这些不是默认包含的; 包含Windows.h 之前,您必须定义OEMRESOURCE 。 不过,我假定用Java,你只是将常量定义为枚举值。 在这种情况下,它们都可以在SetSystemCursor的MSDN文档中找到 。 例如, OCR_NORMAL32512

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

通过“CursorFX”,我相信你正在考虑AniFX(由同一个研究员ItiFX编写的Attila Kovrig)。 这是一个光标图像编辑器,将是创建您需要的* .CUR / *。ANI文件的好方法。 但是您可以轻松地使用其他一些为创建游标而设计的软件; 有无数的选择。

__
不是你想要SetSystemCursor函数,因为SetSystemCursor通过调用DestroyCursor销毁指定的游标。 在调用SetSystemCursor之前,您需要先执行LoadCursor然后再执行CopyCursor 这一切都在SetSystemCursor的文档中阐明,但正如我所说,您不必担心这一点,因为您只是使用LoadImage (没有LR_SHARED标志)。

不,它不适用于windows 10虽然它适用于windows 7

我已经实现了这样的功能,一切工作在Windows 7上。不幸的是,虽然我正在检查如何在Windows 10上工作,我观察到以下行为:

一般来说,这个功能在Windows 10上不起作用。有时我可以观察到,这个游标(当我增加游标大小的时候)闪烁,它的大小就像我所期望的那样。 然后,当我停止增加光标时,它会回到32×32大小。 你可能在Windows 10上面临这样的问题,并有一些有用的提示?