C++ 捕获在Windows上显示动画系统光标的哪个步骤

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

我希望尽可能准确地将Windows操作系统上的系统光标捕获为位图。 据我所知,提供的API是GetCursorInfo、DrawIconEx

简单的行动链是:

  • 使用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是的,请参阅此处: