当前位置: 首页 > news >正文

windows 剪切板的写入、读取,包括图片,文本内容

介绍

        在windows开发过程中,我们可能会需要对系统剪切板进行操作,其中包括读取剪切板数据和将数据写入到剪切板中

设置剪切板内容

/*** @brief 设置剪切板内容* @param[in] pszData  指向缓冲区的指针* @param[in] nDataLen 缓冲区长度* @return 成功返回TRUE,失败返回FALSE*/
static BOOL SetClipboard(const char* pszData, const int nDataLen)
{if (::OpenClipboard(NULL)){::EmptyClipboard();HGLOBAL hMem = ::GlobalAlloc(GMEM_DDESHARE, nDataLen + 1);if (hMem){char *buffer = (char *)::GlobalLock(hMem);strcpy_s(buffer, nDataLen + 1, pszData);::GlobalUnlock(hMem);::SetClipboardData(CF_TEXT, hMem);}::CloseClipboard();return TRUE;}return FALSE;
}

读取剪切板内容

/*** @brief 读取剪切板内容* @return 剪切板内容,失败为空*/
static CStringA GetClipboard()
{CStringA sText;if (::IsClipboardFormatAvailable(CF_TEXT) && ::OpenClipboard(NULL)){HGLOBAL hMem = ::GetClipboardData(CF_TEXT);if (hMem){LPSTR lpStr = (LPSTR)::GlobalLock(hMem);if (lpStr){sText = lpStr;::GlobalUnlock(hMem);}}::CloseClipboard();}return sText;
}

将剪切板复制的图片保存为图片文件

static BOOL SaveClipboardToImageFile(LPCTSTR szFilePath, const SIZE& sizeMin, const SIZE& sizeMax)
{if (!OpenClipboard(NULL))return FALSE;HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);CloseClipboard();if (hBitmap == NULL)return FALSE;Gdiplus::Bitmap* gBitmap = new Gdiplus::Bitmap(hBitmap, NULL);if(gBitmap == NULL){return FALSE;}UINT nWidth = gBitmap->GetWidth();UINT nHeight = gBitmap->GetHeight();BOOL bResult = FALSE;do {if (sizeMin.cx > 0 && sizeMin.cy > 0) {if (nWidth < sizeMin.cx || nHeight < sizeMin.cy) {break;}}if (sizeMax.cx > 0 && sizeMax.cy > 0){if (nWidth > sizeMax.cx || nHeight > sizeMax.cy) {break;}}bResult =  SaveImageFile(*gBitmap, szFilePath);} while (false);delete gBitmap;return bResult;
}

复制图片到剪切板

static BOOL SaveImageFile(Gdiplus::Image& image, LPCTSTR szPath, const WCHAR* format = L"image/png")
{CLSID clsid;if (format == NULL) {format = L"image/png";}if (!GetEncoderClsid(format, clsid)) {return FALSE;}if (Gdiplus::Ok != image.Save(szPath, &clsid)) {return FALSE;}return TRUE;
}static BOOL GetEncoderClsid(const WCHAR* format, CLSID& imageCLSID)
{UINT  num = 0;          // number of image encodersUINT  size = 0;         // size of the image encoder array in bytesGdiplus::ImageCodecInfo* pImageCodecInfo = NULL;Gdiplus::GetImageEncodersSize(&num, &size);if (size == 0)return FALSE;  // FailurepImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));if (pImageCodecInfo == NULL)return FALSE;  // FailureGdiplus::GetImageEncoders(num, size, pImageCodecInfo);for (UINT j = 0; j < num; ++j){if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0){imageCLSID = pImageCodecInfo[j].Clsid;free(pImageCodecInfo);return TRUE;  // Success}}free(pImageCodecInfo);return FALSE;  // Failure
}

http://www.lryc.cn/news/531744.html

相关文章:

  • Matplotlib 高级图表绘制与交互式可视化(mpld3)
  • (9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,
  • 专业学习|通过案例了解蒙特卡罗模拟实操步骤与含义
  • 云端智慧:创业公司如何以全球视野选择最佳平台,实现业务新高度
  • 【工具变量】中国省级八批自由贸易试验区设立及自贸区设立数据(2024-2009年)
  • 猫眼Java开发面试题及参考答案(上)
  • WSL2中安装的ubuntu开启与关闭探讨
  • Linux抢占式内核:技术演进与源码解析
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.28 NumPy+Matplotlib:科学可视化的核心引擎
  • C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】
  • 【深度学习入门_机器学习理论】朴素贝叶斯(NaiveBayes)
  • docker pull Error response from daemon问题
  • javaEE-8.JVM(八股文系列)
  • 25.02.04 《CLR via C#》 笔记 13
  • git 项目的更新
  • 【Rust自学】17.3. 实现面向对象的设计模式
  • 51c视觉~CV~合集10
  • 如何安全地管理Spring Boot项目中的敏感配置信息
  • Docker小游戏 | 使用Docker部署2048网页小游戏
  • RabbitMQ深度探索:消息幂等性问题
  • Linux网络 | 进入数据链路层,学习相关协议与概念
  • 芝法酱学习笔记(2.6)——flink-cdc监听mysql binlog并同步数据至elastic-search和更新redis缓存
  • JavaScript系列(58)--性能监控系统详解
  • GESP2023年12月认证C++六级( 第三部分编程题(1)闯关游戏)
  • git 新项目
  • 系统URL整合系列视频一(需求方案)
  • Vue.js 使用组件库构建 UI
  • 计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战
  • 51单片机入门_05_LED闪烁(常用的延时方法:软件延时、定时器延时;while循环;unsigned char 可以表示的数字是0~255)
  • 如何获取sql数据中时间的月份、年份(类型为date)