如何在C++中获取鼠标光标图标

5

我使用这段代码来获取屏幕上的鼠标位置,它可以正常工作。我还获得了光标的宽度和高度。我需要的是在调用函数GetIconInfo时的光标图标。在ii中,我有ii.hbmColor和ii.hbmMask。hbmColor的值为0x0,hbmMask的值为0x2f0517f1。我能从这两个指针中提取鼠标光标吗?

  CURSORINFO cursorInfo = { 0 };
  cursorInfo.cbSize = sizeof(cursorInfo);

  HDC memoryDC = (HDC)malloc(100);
  memset(memoryDC, 0x00, 100);

  if (::GetCursorInfo(&cursorInfo))  {
    ICONINFO ii = {0};
    GetIconInfo(cursorInfo.hCursor, &ii);

    BITMAP bm;
    GetObject(ii.hbmMask,sizeof(BITMAP),&bm);

    DeleteObject(ii.hbmColor);
    DeleteObject(ii.hbmMask);
    ::DrawIcon(memoryDC, cursorInfo.ptScreenPos.x - ii.xHotspot, cursorInfo.ptScreenPos.y - ii.yHotspot, cursorInfo.hCursor);


    for(int i = 0; i < bm.bmWidth; i++){
        for(int j = 0; j < bm.bmHeight; j++){
            COLORREF c = GetPixel(memoryDC, i, j);
            printf("%x", c);

        }
    }
  }

3
哇,你不能将随机内存转换为HDC。你需要使用CreateDC / CreateCompatibleDC / GetDC。Windows GDI很棘手,但最终会让人感到合理。确保进行错误检查并一次处理一个问题,并且保持MSDN接近。 - tenfour
@tenfour:当我看到那个时,我的眼睛都快瞪出来了。幸运的是,我戴眼镜... - peterchen
2个回答

1
  CURSORINFO cursorInfo = { 0 };
  cursorInfo.cbSize = sizeof(cursorInfo);

  if (::GetCursorInfo(&cursorInfo))
  {
    ICONINFO ii = {0};
    GetIconInfo(cursorInfo.hCursor, &ii);
    DeleteObject(ii.hbmColor);
    DeleteObject(ii.hbmMask);
    ::DrawIcon(memoryDC, cursorPos.x - ii.xHotspot, cursorPos.y - ii.yHotspot, cursorInfo.hCursor);
  }

嗨 - 抱歉回答不够详细。这是我在一个项目中留下的代码。 memoryDC 并不重要 - 它是您想要绘制图标的设备上下文(DC)。重要的是,指向图标的句柄是 cursorInfo.hCursor。 - tenfour
我使用了代码(我的帖子,我进行了编辑),在控制台中只得到了fffffffffffffffff。我犯了什么错误?我只想访问内存中的光标图标。非常感谢您所有的回答。 - Nikola
位图的bmBits为0x000000。 - Nikola
我和你一样遇到了相同的问题,但是我按照这个答案解决了它。https://dev59.com/F2PVa4cB1Zd3GeqP6YSF#10469709 - sMiLo

-2

光标信息的格式如下所述:http://www.daubnet.com/en/file-format-cur

您必须从数据缓冲区的每个位获取每个像素,而不是从每个字节获取,因此1字节=8像素。 此外,请注意某些应用程序可能具有特殊大小的光标(不是8的倍数),例如26x23。 在这种情况下,您将不得不忽略每行的最后几位。 对于一行26个像素,您将获得4个字节,您将读取前3个字节以获取前24个像素,然后读取第4个字节的2个位以获取最后2个像素,然后在跳转到下一行之前忽略最后6个位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接