代码改变世界

Visual C++ Clipboard

  Clingingboy  阅读(5227)  评论(0编辑  收藏  举报

 

 

image

一.使用SetClipboardData 方法赋值

首先用GlobalAlloc方法分配内存

  1. GlobalAlloc 分配内存大小
  2. GlobalLock 锁定内存
  3. 拷贝数据到内存中
  4. GlobalUnlock解锁

OpenClipboard 和CloseClipboard相对应

char szText[]= "Hello, world"; // ANSI characters
if (::OpenClipboard (m_hWnd)) {
    ::EmptyClipboard ();

    HANDLE hData = ::GlobalAlloc (GMEM_MOVEABLE, ::lstrlen (szText) + 1);
    LPSTR pData = (LPSTR) ::GlobalLock (hData);
    ::lstrcpy (pData, szText);
    ::GlobalUnlock (hData);

    ::SetClipboardData (CF_TEXT, hData);
    ::CloseClipboard ();

二.获取Clipboard数据

GetClipboardData 方法获取
GlobalLock 方法可以转型数据(返回是一个VOID指针)

char szText[MAX_PATH];
if (::OpenClipboard (m_hWnd)) {
    HANDLE hData = ::GetClipboardData (CF_TEXT);
    if (hData != NULL) {
        LPCSTR pData = (LPCSTR) ::GlobalLock (hData);
        if (::lstrlen (pData) < MAX_PATH)
            ::lstrcpy (szText, pData);
        ::GlobalUnlock (hData);
    }
    ::CloseClipboard ();
}

 

三.Clipboard Formats

image

不仅仅是字符串复制一个Bitmap图片,

if (::OpenClipboard (m_hWnd)) {
    // Make a copy of the bitmap.
    BITMAP bm;
    CBitmap bitmap;
    CBitmap m_bitmap;
    m_bitmap.LoadBitmap(IDB_BITMAP2);
    m_bitmap.GetObject (sizeof (bm), &bm);
    bitmap.CreateBitmapIndirect (&bm);

    CDC dcMemSrc, dcMemDest;
    dcMemSrc.CreateCompatibleDC (NULL);
    CBitmap* pOldBitmapSrc = dcMemSrc.SelectObject (&m_bitmap);
    dcMemDest.CreateCompatibleDC (NULL);
    CBitmap* pOldBitmapDest = dcMemDest.SelectObject (&bitmap);

    dcMemDest.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &dcMemSrc,
        0, 0, SRCCOPY);
    HBITMAP hBitmap = (HBITMAP) bitmap.Detach ();

    dcMemDest.SelectObject (pOldBitmapDest);
    dcMemSrc.SelectObject (pOldBitmapSrc);

    // Place the copy on the clipboard.
    ::EmptyClipboard ();
    ::SetClipboardData (CF_BITMAP, hBitmap);
    ::CloseClipboard ();
}

获取复制的Bitmap

if (::OpenClipboard (m_hWnd)) {
    HBITMAP hBitmap = (HBITMAP) ::GetClipboardData (CF_BITMAP);
    if (hBitmap != NULL) {
        // Make a local copy of the bitmap.
    }
    ::CloseClipboard ();
}

四.Private Clipboard Formats

除了内置格式,还可以自定义格式

  1. UINT nID = ::RegisterClipboardFormat (_T ("Widget"));
  2. ::SetClipboardData (nID, hData);
  3. HANDLE hData = ::GetClipboardData (nID);

五.Providing Data in Multiple Formats

    可以将多种格式的数据存在Clipboard中
    ::SetClipboardData (nID, hPrivateData);
    ::SetClipboardData (CF_BITMAP, hBitmap);
    ::SetClipboardData (CF_TEXT, hTextData);
    
     

    六.查询可用Formats

    image
     
    1.判断不同格式(IsClipboardFormatAvailable),注意没用完Clipboard时,不要关闭Clipboard,所以把CloseClipboard放最后
    if (::OpenClipboard (m_hWnd)) {
        if (::IsClipboardFormatAvailable (nID)) {
            // Perfect!
        }
        else if (::IsClipboardFormatAvailable (CF_TEXT)) {
            // Not the best, but I'll take it.
        }
        else if (::IsClipboardFormatAvailable (CF_BITMAP)) {
            // Better than nothing.
        }
        ::CloseClipboard ();
    }
    
     
    2.获取后的处理方式同上
    if (::OpenClipboard (m_hWnd)) {
        if (::IsClipboardFormatAvailable (CF_TEXT)) {
            HANDLE hData = ::GetClipboardData (CF_TEXT);
            LPCSTR pData = (LPCSTR) ::GlobalLock (hData);
                
        }
        ::CloseClipboard ();
    }
    
     

参考:MFC Windows程序设计

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2006-04-23 分析petshop3.0显示产品列表
点击右上角即可分享
微信分享提示