場景
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