如何获取鼠标光标图标VS c ++

时间:2010-08-18 07:48:20

标签: c++ windows mouse cursor

我使用此代码在屏幕上获取鼠标位置并且它正在工作。我也得到光标的宽度和高度。我需要的是当我调用函数GetIconInfo时的光标图标。在ii iI中有ii.hbmColor和ii.hbmMaskask。 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);

        }
    }
  }

2 个答案:

答案 0 :(得分:2)

  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);
  }

答案 1 :(得分:-1)

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

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