Как применить маскировку для курсора мыши при записи в иконку (.ico) - PullRequest
2 голосов
/ 22 мая 2019

Я использую GetCursorInfo для захвата курсора, но при сохранении курсора в виде значка на нем появляется черный прямоугольник.

Для окон стандартные курсоры подходят, но мало пользовательских курсоров, с которыми я сталкиваюсь http://www.cursors -4u.com /

Поместил один пример значка курсора в ссылку https://www.google.com/search?q=cursor+icon&rlz=1C1CHBD_enIN789IN789&source=lnms&tbm=isch&sa=X&ved=0ahUKEwix9aj_gq_iAhWCXCsKHcusD0oQ_AUIDigB&biw=1366&bih=657#imgrc=rOxlbRoBfnKs8M:

HRESULT SaveIcon(HICON hIcon, const char* path) 
{
    // Create the IPicture intrface
    PICTDESC desc = { sizeof(PICTDESC) };
    desc.picType = PICTYPE_ICON;
    desc.icon.hicon = hIcon;
    IPicture* pPicture = 0;
    HRESULT hr = OleCreatePictureIndirect(&desc, IID_IPicture, FALSE, (void**)&pPicture);
    if (FAILED(hr)) return hr;

    // Create a stream and save the image
    IStream* pStream = 0;
    CreateStreamOnHGlobal(0, TRUE, &pStream);
    LONG cbSize = 0;
    hr = pPicture->SaveAsFile(pStream, TRUE, &cbSize);

    // Write the stream content to the file
    if (!FAILED(hr)) 
    {
        HGLOBAL hBuf = 0;
        GetHGlobalFromStream(pStream, &hBuf);
        void* buffer = GlobalLock(hBuf);
        HANDLE hFile = CreateFileA(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
        if (!hFile) 
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
        }
        else 
        {
            DWORD written = 0;
            WriteFile(hFile, buffer, cbSize, &written, 0);
            CloseHandle(hFile);
        }
        GlobalUnlock(buffer);
    }
    // Cleanup
    pStream->Release();
    pPicture->Release();
    return hr;
}

//Capture cursor.
CURSORINFO getHCursor()
{
  CURSORINFO cursorInfo;
  cursorInfo.cbSize = sizeof(CURSORINFO);

  if (GetCursorInfo(&cursorInfo) == 0) 
  { 
    MessageBox(NULL, _T("Exception : GetCursorInfo creation failed"),_T("message"),MB_OK|MB_SYSTEMMODAL);       
    cursorInfo.hCursor = NULL;
    return cursorInfo;
  }

  return cursorInfo;
}

//Main Call
int _tmain(int argc, _TCHAR* argv[])
{
    while (true)
    {
        CURSORINFO CursorInfo = getHCursor();
        if (CursorInfo.hCursor == NULL) 
        {           
            ::Sleep(MinSleep);
            continue;
        }       

        SaveIcon((HICON)CursorInfo.hCursor, "C:\\Users\\Desktop\\myicon.ico");

        Sleep(MaxSleep);
    }   
    return 0;
}

Моя задача - захватить курсор и сохранить курсор на значке (.ico) файл или загрузить в буфер.

Можно ли каким-либо другим способом записать данные курсора в файл значка или буфер?

1 Ответ

0 голосов
/ 23 мая 2019

Структура ICONINFO содержит два члена, hbmMask и hbmColor, которые содержат соответственно маску и цветные растровые изображения для курсора (см. Страницу MSDN для ICONINFO дляофициальная документация).

Когда вы вызываете GetIconInfo() для курсора по умолчанию, структура ICONINFO содержит как действительные маски, так и цветовые растровые изображения.

Возможно, существует лучший способвизуализировать курсор как комбинацию вызовов методов BitBlt() - BitBlt() - MakeTransparent().

Обратитесь к подходу @Tarsier, хотя это C #, но идея та же.

Ссылка: Захват изображения курсора мыши

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...