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 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
}