您的位置:首页 > 编程语言 > C语言/C++

[Windows-macOS]_[C/C++-Object-c]_[复制文本和图片到剪切板]

2020-05-10 04:10 2875 查看

场景

  1. Windows,macOS
    开发界面时,往往需要复制界面上的文本内容到剪切板,或者需要把一个图片复制到剪切板,便于粘贴到QQ,微信里,怎么做到呢?

说明

  1. 无论时

    Windows
    还是
    macOS
    ,都有相对应的复制文本到剪切板或者复杂图片到剪切板, 文本方面不用说,不会很复杂,复杂的地方就在于复制图片到剪切板上.

  2. Windows
    有需要存储
    BITMAP
    到图像格式,所以在保存前需要得到BITMAP格式,方便的是
    Gdiplus
    为我们提供了
    Bitmap
    类,并可以把类
    Bitmap
    转换为
    BITMAP
    格式,之后把这个格式数据通过
    Win32
    函数
    SetClipboardData
    存储到剪切板里。

  3. 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

4.nspasteboard-setdatafortype-nsimage-fails-for-png-file

5.nf-winuser-setclipboarddata

infoworld 博客专家 原创文章 347获赞 126访问量 120万+ 关注 他的留言板
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: