介绍

        在windows开发过程中,我们可能会需要对系统剪切板进行操作,其中包括读取剪切板数据和将数据写入到剪切板中

设置剪切板内容

/**
 * @brief 设置剪切板内容
 * @param[in] pszData  指向缓冲区的指针
 * @param[in] nDataLen 缓冲区长度
 * @return 成功返回TRUE,失败返回FALSE
 */
static BOOL SetClipboard(const char* pszData, const int nDataLen)
{
    if (::OpenClipboard(NULL))
    {
        ::EmptyClipboard();
        HGLOBAL hMem = ::GlobalAlloc(GMEM_DDESHARE, nDataLen + 1);
        if (hMem)
        {
            char *buffer = (char *)::GlobalLock(hMem);
            strcpy_s(buffer, nDataLen + 1, pszData);
            ::GlobalUnlock(hMem);
            ::SetClipboardData(CF_TEXT, hMem);
        }
        ::CloseClipboard();
        return TRUE;
    }
    return FALSE;
}

读取剪切板内容

/**
 * @brief 读取剪切板内容
 * @return 剪切板内容,失败为空
 */
static CStringA GetClipboard()
{
    CStringA sText;
    if (::IsClipboardFormatAvailable(CF_TEXT) && ::OpenClipboard(NULL))
    {
        HGLOBAL hMem = ::GetClipboardData(CF_TEXT);
        if (hMem)
        {
            LPSTR lpStr = (LPSTR)::GlobalLock(hMem);
            if (lpStr)
            {
                sText = lpStr;
                ::GlobalUnlock(hMem);
            }
        }
        ::CloseClipboard();
    }
    return sText;
}

将剪切板复制的图片保存为图片文件

static BOOL SaveClipboardToImageFile(LPCTSTR szFilePath, const SIZE& sizeMin, const SIZE& sizeMax)
{
    if (!OpenClipboard(NULL))
        return FALSE;

    HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);

    CloseClipboard();

    if (hBitmap == NULL)
        return FALSE;

    Gdiplus::Bitmap* gBitmap = new Gdiplus::Bitmap(hBitmap, NULL);
    if(gBitmap == NULL)
    {
        return FALSE;
    }

    UINT nWidth = gBitmap->GetWidth();
    UINT nHeight = gBitmap->GetHeight();
    BOOL bResult = FALSE;
    do {
        if (sizeMin.cx > 0 && sizeMin.cy > 0) 
        {
            if (nWidth < sizeMin.cx || nHeight < sizeMin.cy) 
            {
                break;
            }
        }
        if (sizeMax.cx > 0 && sizeMax.cy > 0)
        {
            if (nWidth > sizeMax.cx || nHeight > sizeMax.cy) {
                break;
            }
        }
        bResult =  SaveImageFile(*gBitmap, szFilePath);
    } while (false);

    delete gBitmap;
    return bResult;
}

复制图片到剪切板

static BOOL SaveImageFile(Gdiplus::Image& image, LPCTSTR szPath, const WCHAR* format = L"image/png")
{
    CLSID clsid;
    if (format == NULL) 
    {
        format = L"image/png";
    }

    if (!GetEncoderClsid(format, clsid)) 
    {
        return FALSE;
    }

    if (Gdiplus::Ok != image.Save(szPath, &clsid)) 
    {
        return FALSE;
    }

    return TRUE;
}

static BOOL GetEncoderClsid(const WCHAR* format, CLSID& imageCLSID)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes

    Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;

    Gdiplus::GetImageEncodersSize(&num, &size);
    if (size == 0)
        return FALSE;  // Failure

    pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
    if (pImageCodecInfo == NULL)
        return FALSE;  // Failure

    Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);

    for (UINT j = 0; j < num; ++j)
    {
        if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
        {
            imageCLSID = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return TRUE;  // Success
        }
    }

    free(pImageCodecInfo);
    return FALSE;  // Failure
}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐