场景
Windows,macOS
开发界面时,往往需要复制界面上的文本内容到剪切板,或者需要把一个图片复制到剪切板,便于粘贴到QQ,微信里,怎么做到呢?
说明
-
无论时
Windows
还是macOS
,都有相对应的复制文本到剪切板或者复杂图片到剪切板, 文本方面不用说,不会很复杂,复杂的地方就在于复制图片到剪切板上. -
Windows
有需要存储BITMAP
到图像格式,所以在保存前需要得到BITMAP格式,方便的是Gdiplus
为我们提供了Bitmap
类,并可以把类Bitmap
转换为BITMAP
格式,之后把这个格式数据通过Win32
函数SetClipboardData
存储到剪切板里。 -
macOS
可以存储PNG
或TIFF
格式,但是不需要转换,只需要把通用数据类型NSData
存储即可。
macOS 例子
存储文本
[[NSPasteboard generalPasteboard] clearContents];
[[NSPasteboard generalPasteboard] setString:ms->text_ forType:NSStringPboardType];
存储图片
NSData* imageData = [NSData dataWithContentsOfFile:[NSString stringWithUTF8String:path]];
NSImage* image = [[NSImage alloc] initWithData:imageData];
NSPasteboard* paste = [NSPasteboard generalPasteboard];
[paste clearContents];
[paste setData:imageData forType:NSPasteboardTypePNG];
Windows 例子
储存文本
注意GlobalAlloc
出来的对象, 如果SetClipboardData
成功, 那么对象hdst
就会被系统持有,不需要自己释放.
size_t len = chat->body.size();
// Allocate string for cwd
hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
dst = (LPWSTR)GlobalLock(hdst);
memcpy(dst, chat->body.c_str(), len * sizeof(WCHAR));
dst[len] = 0;
GlobalUnlock(hdst);
int result = 0;
// Set clipboard data
if (!OpenClipboard()){
GlobalFree(hdst);
return;
}
EmptyClipboard();
if (!SetClipboardData(CF_UNICODETEXT, hdst)){
GlobalFree(hdst);
return;
}
CloseClipboard();
存储图片
static bool CopyFileToClipboard(const wchar_t* path)
{
bool result = false;
Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(path);
if (gdibmp)
{
HBITMAP hbitmap;
gdibmp->GetHBITMAP(0, &hbitmap);
if (OpenClipboard(NULL))
{
EmptyClipboard();
DIBSECTION ds;
if (GetObject(hbitmap, sizeof(DIBSECTION), &ds))
{
HDC hdc = GetDC(HWND_DESKTOP);
//create compatible bitmap (get DDB from DIB)
HBITMAP hbitmap_ddb = CreateDIBitmap(hdc, &ds.dsBmih, CBM_INIT,
ds.dsBm.bmBits, (BITMAPINFO*)&ds.dsBmih, DIB_RGB_COLORS);
ReleaseDC(HWND_DESKTOP, hdc);
SetClipboardData(CF_BITMAP, hbitmap_ddb);
DeleteObject(hbitmap_ddb);
result = true;
}
CloseClipboard();
}
//cleanup:
DeleteObject(hbitmap);
delete gdibmp;
}
return result;
}
参考
1.how-to-copy-a-picture-from-disk-into-the-clipboard-with-win32
2.how-to-take-region-screenshot-in-mac-os-x-using-cocoa-and-cgdisplaycreateimagefo
3.how-to-copy-textfield-to-osx-clipboard