捕获在 Windows 上显示动画系统光标的哪一步

Posted

技术标签:

【中文标题】捕获在 Windows 上显示动画系统光标的哪一步【英文标题】:Capture which step of an animated system cursor is being shown on Windows 【发布时间】:2008-10-12 18:50:56 【问题描述】:

我想尽可能准确地将 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 参数的值...)?目前,上面的代码显然总是只渲染动画光标的第一步。

我怀疑这不容易做到,但无论如何都值得一问。

【问题讨论】:

【参考方案1】:

不幸的是,我认为没有公开光标动画当前帧的 Windows API。我假设这就是您所追求的:在您制作快照时光标的外观。

【讨论】:

【参考方案2】:

我怀疑你错过了一步。

您需要创建一个位图以选择到您的设备上下文中,否则您的位图只是一个像素。

请参阅 MSDN 文档中的 CreateCompatibleBitmap:

HBITMAP CreateCompatibleBitmap( HDC hdc, // 处理 DC int nWidth, // 位图的宽度,以像素为单位 int nHeight // 位图的高度,以像素为单位 );

使用 DrawIconEx,UINT istepIfAniCur 参数允许您选择要绘制的帧(如果它是动画光标)。

它在你的 cmets 中说:

0, // 动画光标的步长

【讨论】:

嗨,David,我需要知道正在绘制动画光标的哪一步,以便可以将该值传递给 DrawIconEx。关于创建 DC 的注释正在替换所有关于创建 DC、位图、选择位图的代码。这不是问题。 嗯。几乎是一个不同的问题。我会看一些系统挂钩函数。但我怀疑它会在那里。 如果您以某种方式成功地找出了当前帧,那么您会失望地发现 DrawIconEx 无法在磁盘上不作为文件存在的动画光标上工作。此限制通常还扩展到从其他应用程序访问游标。我花了很多时间为 Wine 项目做这件事,我发现你需要使用 GetCursorFrameInfo() 从所有不同类型的动画光标中正确获取帧。 @Compholio Btw,你知道 GetCursorFrameInfo 的信息/参数吗? @Nicke Manarin 是的,请看这里:https://source.winehq.org/source/dlls/user32/cursoricon.c?!v=wine-2.17#1924

以上是关于捕获在 Windows 上显示动画系统光标的哪一步的主要内容,如果未能解决你的问题,请参考以下文章

批处理脚本错误:获取一年中的哪一天

确定 UIImageView 正在显示它的哪个动画图像?

在鼠标光标平面上绘图或创建自定义动画系统光标?

DAO 类属于 Web 应用程序的 3 层架构中的哪一层?

我的 JBehave 验收测试应该针对 DDD 应用程序中的哪一层?

不移动鼠标光标时Java动画口吃