如何获得鼠标光标图标VS C++

Posted

技术标签:

【中文标题】如何获得鼠标光标图标VS C++【英文标题】:How to get mouse cursor icon VS c++ 【发布时间】:2010-08-18 07:48:20 【问题描述】:

我使用此代码来获取屏幕上的鼠标位置并且它正在工作。我还得到了光标的宽度和高度。我需要的是在我调用函数 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);

        
    
  

【问题讨论】:

哇,您不能将随机内存转换为 HDC。你需要CreateDC/CreateCompatibleDC/GetDC。 Windows GDI 很难适应,但最终还是有意义的。确保您每次都进行错误检查和处理问题,同时让 MSDN 靠近。 @tenfour:当我看到它时,我的眼睛突然冒了出来。幸运的是,我戴着眼镜...... 【参考方案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。 我使用代码(我的帖子,我做编辑)并在控制台中得到只是 ffffffffffffffffff。我在哪里做错了?我只想访问内存中的光标图标。非常感谢您的所有回答。 位图的bmBits是0x000000 我和你有同样的结果,但我根据这个答案解决了。 ***.com/a/10469709/1837846【参考方案2】:

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

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

【讨论】:

以上是关于如何获得鼠标光标图标VS C++的主要内容,如果未能解决你的问题,请参考以下文章

C# Winforms - 更改鼠标的光标图标

c++语言如何隐藏光标,要详细的注释,不能让人看不懂!

Qt 应用程序的默认鼠标图标

我怎样把图片作为光标图案啊!!教教我!!

使用 Windows 窗体应用程序时如何将鼠标光标更改为自定义光标?

自定义鼠标光标cursor