C++ 捕获在Windows上显示动画系统光标的哪个步骤
我希望尽可能准确地将Windows操作系统上的系统光标捕获为位图。 据我所知,提供的API是GetCursorInfo、DrawIconEx 简单的行动链是:C++ 捕获在Windows上显示动画系统光标的哪个步骤,c++,winapi,C++,Winapi,我希望尽可能准确地将Windows操作系统上的系统光标捕获为位图。 据我所知,提供的API是GetCursorInfo、DrawIconEx 简单的行动链是: 使用GetCursorInfo获取游标 使用DrawIconEx在内存DC中绘制光标 下面是代码的大致外观 CURSORINFO CursorInfo; (VOID)memset(&CursorInfo, 0, sizeof(CursorInfo)); CursorInfo.cbSize = sizeof(CursorIn
- 使用GetCursorInfo获取游标
- 使用DrawIconEx在内存DC中绘制光标
CURSORINFO CursorInfo;
(VOID)memset(&CursorInfo, 0, sizeof(CursorInfo));
CursorInfo.cbSize = sizeof(CursorInfo);
if (GetCursorInfo(&CursorInfo) &&
CursorInfo.hCursor)
{
// ... create here the memory DC, memory bitmap
boError |= !DrawIconEx(hCursorDC, // device context
0, // xLeft
0, // yTop
CursorInfo.hCursor, // cursor handle
0, // width, use system default
0, // height, use system default
0, // step of animated cursor !!!!!!!!!
NULL, // flicker free brush, don't use it now
DI_MASK | DI_DEFAULTSIZE); // flags
// ... do whatever we want with the cursor in our memory DC
}
现在,任何人都知道如何获得正在绘制的动画光标的哪一步(我需要可以传递给DrawIconEx的istepIfAniCur参数的值…)?目前,上述代码显然总是只渲染动画光标的第一步
我怀疑这不容易做到,但无论如何还是值得一问。我怀疑你错过了一步 您需要创建一个位图来选择设备上下文,否则位图只是一个像素 请参见MSDN文档中的CreateCompatibleBitmap: HBITMAP CreateCompatibleBitmap( HDC hdc, // handle to DC int nWidth, // width of bitmap, in pixels int nHeight // height of bitmap, in pixels ); HBITMAP CreateCompatibleBitmap( HDC HDC,//到DC的句柄 int nWidth,//位图的宽度,以像素为单位 int nHeight//位图的高度,以像素为单位 ); 使用DrawIconEx,UINT istepIfAniCur参数允许您选择要绘制的帧(如果是动画光标) 它在你的评论中说: 0, // step of animated cursor 0,//动画光标的步骤
不幸的是,我认为没有一个Windows API公开光标动画的当前帧。我想这就是您所追求的:创建快照时光标的外观。您好,David,我需要知道正在绘制动画光标的哪一步,以便将该值传递给DrawIconEx。关于创建DC的注释将替换关于创建DC、位图和选择位图的所有代码。这不是问题所在。几乎是另一个问题。我将介绍一些系统钩子函数。但我怀疑它是否会存在。如果你设法成功地计算出当前帧,那么你会失望地发现DrawIconEx无法在磁盘上不存在文件的动画游标上工作。此限制通常还扩展到从其他应用程序访问游标。我花了很多时间在Wine项目上,发现您需要使用GetCursorFrameInfo()从所有不同类型的动画光标中正确获取帧。@Compholio顺便问一下,您知道GetCursorFrameInfo的信息/参数吗?@Nicke Manarin是的,请参阅此处: