Как получить значок курсора мыши VS c ++ - PullRequest
4 голосов
/ 18 августа 2010

Я использую этот код, чтобы получить положение мыши на экране, и он работает. Я также получаю ширину и высоту курсора. Что мне нужно, так это значок курсора в тот момент, когда я вызываю функцию 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);

        }
    }
  }

Ответы [ 2 ]

2 голосов
/ 18 августа 2010
  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 голосов
/ 13 мая 2011

информация курсора отформатирована, как объяснено здесь: http://www.daubnet.com/en/file-format-cur

Вы должны получать каждый пиксель из каждого бита буфера данных, а не из каждого байта, поэтому 1 байт = 8 пикселей.Кроме того, будьте осторожны с некоторыми приложениями, которые могут иметь курсоры специального размера (не кратные 8), например 26x23. В этом случае вам придется игнорировать последние биты каждой строки.со строкой 26 пикселей вы получите 4 байта, вы прочитаете первые 3 байта, чтобы получить 24 первых пикселя, а затем прочитаете 2 бита 4-го байта, чтобы получить последние 2 пикселя, а затем проигнорируете последние6 битов, прежде чем перейти к следующей строке.

...