windows 剪切板的写入、读取,包括图片,文本内容
介绍
在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 encodersUINT size = 0; // size of the image encoder array in bytesGdiplus::ImageCodecInfo* pImageCodecInfo = NULL;Gdiplus::GetImageEncodersSize(&num, &size);if (size == 0)return FALSE; // FailurepImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));if (pImageCodecInfo == NULL)return FALSE; // FailureGdiplus::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
}