2010-08-18 72 views
3

我使用此代码来获得鼠标在屏幕上的位置,它的工作。我也得到光标的宽度和高度。我需要的是当我调用函数GetIconInfo时的光标图标。 ii ii我有ii.hbmColor和ii.hbmMask。 hbmColor的值是0x0,hbmMask是0x2f0517f1。我能从这两个指针中提取鼠标光标吗?如何获取鼠标光标图标VS C++

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

哇,你不能只是随机存储器作为一个HDC。你需要'CreateDC' /'CreateCompatibleDC' /'GetDC'。 Windows GDI很难习惯,但最终它是有意义的。 确保您一次执行一个错误检查并处理问题,并保持MSDN密切关注。 – tenfour 2010-08-18 16:02:57

+0

@tenfour:当我看到那个时,我的眼睛突然出现。高兴地说,我戴眼镜... – peterchen 2010-08-18 17:48:25

+0

有点帮助吗?一些例子? – Nikola 2010-08-18 18:18:25

回答

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

什么是memoryDC? – Nikola 2010-08-18 11:36:54

+0

嗨 - 对于简短的回答抱歉。这是我在一个项目中放置的代码。内存DC是什么并不重要 - 它是你想要绘制图标的DC。重要的是该图标的句柄是cursorInfo.hCursor。 – tenfour 2010-08-18 13:54:14

+0

我使用代码(我的文章,我做编辑),并在控制台中得到只是ffffffffffffffffff。我犯了什么错误?我只想访问内存中的光标图标。非常感谢您的答复。 – Nikola 2010-08-18 15:26:31

-1

信息被格式化像光标解释这里:http://www.daubnet.com/en/file-format-cur

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