[Windows-macOS]_[C/C++-Object-c]_[复制文本和图片到剪切板]
2020-05-10 04:10
2875 查看
场景
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
4.nspasteboard-setdatafortype-nsimage-fails-for-png-file
infoworld 博客专家 原创文章 347获赞 126访问量 120万+ 关注 他的留言板相关文章推荐
- 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件
- 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件
- Windows 剪切板的应用——复制浏览器or本地目录图片
- js实现将文本复制到剪切板中
- Appmethod 1.17 - Object Pascal/C++ 跨平台开发工具之 Windows 10 安装
- JS复制图片文字到剪切板
- JNA操作windows 剪切板并生成emf图片
- JavaScript访问剪切板,实现“点击按钮后,复制自己想要复制的文本“
- 剪切板 复制文本 ClipboardManager
- C++对象模型——对象复制语意学 (Object Copy Semantics)(第五章)
- JS将文本复制到剪切板
- MailBee.NET ObjectsL显示HTML/纯文本邮件教程(三):显示带嵌入图片的邮件
- 如何将word中的图片复制到windows live writer 保持大小不变--清晰度不变
- java使用IO流完成文件的复制(文本、图片、视频)
- 将文本的内容复制到剪切板,ZeroClipboard
- android实现文本复制到剪切板功能(ClipboardManager)
- JS图片复制到剪切板
- 文件输入输出流(复制文本,视频,音频,图片的多种方式)
- clipboard.js复制文本到剪切板