如何获得鼠标光标图标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++的主要内容,如果未能解决你的问题,请参考以下文章