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

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 encoders
    UINT  size = 0;         // size of the image encoder array in bytes

    Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;

    Gdiplus::GetImageEncodersSize(&num, &size);
    if (size == 0)
        return FALSE;  // Failure

    pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
    if (pImageCodecInfo == NULL)
        return FALSE;  // Failure

    Gdiplus::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.kler.cn/a/533289.html

相关文章:

  • 基于Springboot框架的学术期刊遴选服务-项目演示
  • 二维数组 C++ 蓝桥杯
  • MYSQL面试题总结(题目来源JavaGuide)
  • [Proteus仿真]基于51单片机的智能温控系统
  • 强化学习笔记(5)——PPO
  • C#,入门教程(11)——枚举(Enum)的基础知识和高级应用
  • 代码随想录二刷|回溯1
  • 嵌入式开发:PPM是什么单位
  • 基础篇05-直方图操作
  • 深度整理总结MySQL——Count的工作原理
  • Swagger相关内容整合
  • 【实用小技巧】git如何添加一个文件的一部分修改到暂存区(git add -p)
  • 深入理解 JavaScript 的 Promise:实例方法与静态方法
  • 无法连接到远程扩展主机服务器
  • 如何解决 Vue 应用中的内存泄漏
  • css 之 clip-path
  • 本地大模型编程实战(08)自制聊天机器人(2)
  • Java 常见的面试题(Hibernate)
  • 基于SpringBoot浪狼狗领养系统
  • C++多线程编程——call_once和单例模式
  • 【AI日记】25.02.05 自由不是一种工具
  • 2025年2月4日--2月9日(ue4.0shader抄写+ue5肉鸽独立游戏视频)
  • DeepSeek大模型介绍、本地化部署与使用!【AI大模型】
  • 数据库系统概念第六版记录 一
  • 【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)
  • 总结11..