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

场景

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

说明

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

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

  3. macOS可以存储PNGTIFF格式,但是不需要转换,只需要把通用数据类型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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值