2010-08-18 71 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位。