MFC-剪贴板

 

复制文本到剪贴板 

复制代码
    //**********复制文本到剪贴板**********

    CString text = _T("我是中国人");
    BOOL b = OpenClipboard();  //打开剪贴板
    /*
    返回值:
            如果通过CWnd打开了剪贴板,则返回非零值
            如果其他应用程序或窗口已经打开了剪贴板,则返回零
    说明:
    在调用Windows的CloseClipboard函数之前,其他应用程序将不能修改剪贴板的内容
    在调用Windows的EmptyClipboard函数之前,当前的CWnd对象将不会成为剪贴板的拥有者。
    */
    
    if (b) {
        EmptyClipboard(); // 清空剪贴板内容
        HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (text.GetLength() + 1) * sizeof(TCHAR)); // 分配内存
        /*
        参数1 类型及说明
             uFlags Long,对分配的内存类型进行定义的常数标志,如下所示:
             GMEM_FIXED 分配一个固定内存块,返回值是一个指针
             GMEM_MOVEABLE 分配一个可移动内存块
                    分配可移动的内存,在Win32中内存块在物理内存中是不可移动的,但在缺省堆中可以.
                    返回值是该内存对象的句柄,可使用函数 GlobalLock 将该句柄转换为一个指针.
                    这个标识不能与 GMEM_FIXED 组合使用.
             GMEM_ZEROINIT 新分配的内存块全部初始化成零
             GHND         为GMEM_MOVEABLE 和 GMEM_ZEROINIT的组合
             GPTR         为GMEM_FIXED和GMEM_ZEROINIT组合
          
      参数2:dwBytes Long,指定要申请的字节数. 若该参数为 0 且参数 uFlags 指定为 GMEM_MOVEABLE 则该函数返回一个内存对象的句柄,该内存对象被标识为discarded(可抛弃的) 返回值:若函数调用成功,则返回一个新分配的内存对象的句柄 若函数调用失败,则返回NULL。可调用GetLastError以获得更多错误信息 注解: 如果堆内没有足够的空间满足请求,函数将返回 NULL 若函数调用成功,将至少分配所需内存.若实际分配量超过所需,则内存仍然能够充分利用之.可用函数 GlobalSize 来确定实际所分配的字节数 可使用 GlobalFree 来释放内存。
*/ if (hMem != NULL) { LPTSTR lptstrCopy = (LPTSTR)GlobalLock(hMem); // 锁定内存并绑定指定指针 /* 锁定内存中指定的内存块,除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效 参数:HGLOBAL hMem 指定一个全局内存块的句柄,这个句柄是通过GlobalAlloc或GlobalReAlloc来得到的 返回值:Long,如成功,返回内存块的地址 如出错,或者这是一个已被丢弃的“可丢弃”内存块,则返回零。会设置GetLastError参数表 注意:调用过GlobalLock锁定一块内存区后,一定要调用GlobalUnlock来解锁 */ _tcscpy_s(lptstrCopy, text.GetLength() + 1, text); // 复制文本到内存 /* 说明:参数1是指向内存hMem,其实就是把数据复制到内存hMem */ GlobalUnlock(hMem); // 解锁内存 HANDLE hand=SetClipboardData(CF_UNICODETEXT, hMem); // 设置剪切板 /* 参数1:UINT uFormat CF_DIB——DIB图片,它包含一个BITMAPINFO结构,然后是位图位 CF_DIF——软件领域的数据交换格式 CF_PALETTE——调色板 CF_PENDATA——笔扩展的Microsoft笔计算的数据 CF_RIFF——表示更复杂的音频数据可以被表示为一个CF_WAVE的标准波形格式 CF_SYLK——微软符号链接(SYLK)格式 CF_TEXT——ANSI文本格式。回车/换行(CR-LF)组合表示换行。必须用NULL结束字符串。使用此格式为ANSI文本 CF_WAVE——表示在的标准电波格式之一,例如11kHz或22kHz的脉冲编码调制(PCM)的音频数据 CF_TIFF——TIFF标记图像文件格式 CF_UNICODETEXT——Unicode文本格式
            CF_BITMAP 位图 参数2:HANDLE hMem 具有指定格式的数据的句柄,该参数可以是空 返回值:类型: HANDLE 如果函数成功,则返回值是数据的句柄 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError
*/ } CloseClipboard(); // 关闭剪贴板 }
复制代码

 

从剪贴板中获取文本 

复制代码
    //**********从剪贴板中获取文本**********

    if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard()) {
        /*
        IsClipboardFormatAvailable  确定剪贴板是否包含指定格式的数据
        返回值:类型: BOOL
            如果剪贴板格式可用,则返回值为非零。
            如果剪贴板格式不可用,则返回值为零。 要获得更多的错误信息,请调用 GetLastError
        */

        HGLOBAL hMem = GetClipboardData(CF_UNICODETEXT); //获取剪贴板内容
        /*
        参数:UINT 指定要获取的数据的格式
                常见的数据格式包括CF_TEXT(ANSI文本) 、CF_BITMAP(位图) 、CF_DIB(设备无关位图)等
        傳回值:類型: HANDLE
                如果函式成功,則傳回值是指定格式之剪貼簿物件的控制碼。
                如果函式失敗,則傳回值為 Null。 若要取得擴充的錯誤資訊,請呼叫 GetLastError        
        */

        if (hMem != NULL) {
            LPCTSTR lptstr = (LPCTSTR)GlobalLock(hMem);
            CString text(lptstr);
            GlobalUnlock(hMem);
            // 对获取到的文本进行处理

            ::OutputDebugString(text);

        }
        CloseClipboard();

    }

    
复制代码

 

 

 

 

 

 

posted @   天子骄龙  阅读(347)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-08-27 C++继承
2020-08-27 C++迭代器iterator
2020-08-27 C++pair-组合两个数据
2019-08-27 qt5-QDir目录
点击右上角即可分享
微信分享提示

目录导航