如何在写入icon(.ico)

时间:2019-05-22 12:18:16

标签: c++ winapi cursor

我使用GetCursorInfo捕获光标,但是将光标另存为图标时,图标上出现了一个黑色矩形。

对于Windows,默认光标很好,但我遇到此问题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;
}

我的议程是捕获光标并将光标保存到icon..ico文件或加载到缓冲区。

还有其他方法可以将光标数据写入图标文件或缓冲区吗?

1 个答案:

答案 0 :(得分:0)

ICONINFO结构包含两个成员hbmMaskhbmColor,它们分别包含光标的蒙版和颜色位图(请参见MSDN页上的{ {1}}(用于官方文档)。

当您调用ICONINFO作为默认光标时,GetIconInfo()结构同时包含有效的掩码和颜色位图。

  

有一种更好的方式可以呈现光标   ICONINFO-BitBlt()-BitBlt()组合方法   电话。

请参阅@Tarsier方法,尽管它是C#,但想法是相同的。

链接:Capturing the Mouse cursor image