gpt4 book ai didi

c - SetSystemCursor 不为 *.ani 光标设置动画

转载 作者:行者123 更新时间:2023-11-30 16:49:20 24 4
gpt4 key购买 nike

我几乎用尽了 Google 和 SO 上的每个链接,但没有找到解决方案...这可能是重复的,但其他问题要么没有得到解答,要么没有帮助,并且已经存在多年了。由于某种原因,对我来说没有任何作用。

在我的程序中,我需要根据事件功能将系统范围的光标更改为不同的光标。该程序添加并扩展了鼠标的功能,并且更改光标将是事件功能的指示器。用户将选择加入此功能,因为知道光标会发生变化。

现在的问题是,使用 SetSystemCursor 似乎没有动画,而只是绘制动画的第一帧。我注意到,通过使用 SetCursor 动画可以工作,但仅限于应用程序本身(仅用于设置。它也不保留光标类型(箭头、文本、链接...))。为什么 SetSytemCursor 不起作用,有没有办法让它起作用?

<小时/><小时/>

到目前为止我尝试过的示例...它们都在绘制动画的第一帧的范围内起作用,但没有一个真正产生动画。相反,使用 SetCursor 将生成动画光标,但不会根据需要生成系统范围的特定光标。 Set* 函数成功返回。

1:简单尝试设置光标

SetSystemCursor( LoadCursorFromFile( L"custom_cursor.ani" ), OCR_NORMAL );
<小时/>

2:我的尝试,使用文档中编写的内容

/* Global HCURSOR */ arrowCurs = LoadCursorFromFile( L"custom_cursor.ani" );
HCURSOR temp = ( HCURSOR )CopyImage( arrowCurs, IMAGE_CURSOR, 0, 0, 0 );
SetSystemCursor( temp, OCR_NORMAL );
DestroyCursor( temp );
<小时/>

3:这是我找到的一个答案,链接丢失了

FILE* fs = fopen( "--full path--\\custom_cursor.ani", "rb" );
fseek( fs, 0, SEEK_END ); int dwSize = ftell( fs ); fseek( fs, 0, SEEK_SET );
char* memory = new char[ dwSize + guardbandSize ];
fread( memory, 1, dwSize, fs ); memset( memory + dwSize, 0, guardbandSize );
fclose( fs );
SetSystemCursor( ( HCURSOR )CreateIconFromResource( ( PBYTE )memory, dwSize, FALSE, 0x00030000 ), 32512 );
delete memory;
<小时/><小时/>

到目前为止,唯一的解决方案是不更改光标图标,而是将其隐藏并绘制一个无边框的最顶部窗口,并在其上绘制动画。但是,如果由于增加的复杂性和不优雅而无法使用 SetSystemCursor,我想将其保留为最后一个选项。

使用 Windows 10 x64 和 Visual Studio 2015

最佳答案

更好的解决方案仍然值得赞赏。

基于波特的评论和我自己的经验;看来您无法使用 SetSystemCursor 设置 .ani 光标 - 此解决方案将成功地将光标更改为动画光标,但它需要管理员权限,并请注意,它将为给定用户永久设置光标,这与 SetSystemCursor 不同,SetSystemCursor 是临时的直到 session 重新启动。

HKEY key;
// The location of the new cursor to be set:
LPCWSTR loc = L"C:\\--full path--\\custom_cursor.ani";

if ( ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, L"Control Panel\\Cursors", 0, KEY_SET_VALUE, &key ) &&
ERROR_SUCCESS == RegSetValueEx( key, L"Arrow", 0, REG_EXPAND_SZ, ( LPBYTE )loc, wcslen( loc ) * sizeof( WCHAR ) ) )
{
RegCloseKey(key);
}
else
{
// Print error if failed
WCHAR msg[ 256 ];
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 0, 0, 0, msg, 256, 0 );
OutputDebugString( msg );
}

SystemParametersInfo( SPI_SETCURSORS, 0, NULL, 0 ); // Reload system cursors

分别将L“箭头”更改为任何其他光标类型以更改其图标。

还值得在外部存储原始注册表值并实现退出时或崩溃时重置的方法。

关于c - SetSystemCursor 不为 *.ani 光标设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42614391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com