windows粘贴板操作-自己的应用和windows右键互动

一、粘贴板操作函数

BOOL OpenClipboard(HWND hWnd);参数 hWnd 是打开剪贴板的窗口句柄,成功返回TRUE,失败返回FALSE

BOOL CloseClipboard();关闭剪贴板

BOOL EmptyClipboard();清空剪贴板

HANDLE SetClipboardData(CF_HDROP, hGblFiles );往剪切板设置数据

HANDLE GetClipboardData(UINT uFormat);得到剪贴板中的数据,uFormat是所需要数据的格式,例如本文拖放对象的格式为CF_HDROP

UINT uDropEffect=RegisterClipboardFormat(“Preferred DropEffect”); 注册数据类型

详细函数阅读:WINDOWS API——OPENCLIPBOARD——剪切板

往剪贴板中放的数据必须是内存对象:HGLOBAL。这个对象可以通过GlobalAlloc来生成。然后使用GlobalLock就可以得到该对象的内存地址,继而往里面写 数据。实际上在Win32中由于进程拥有独立的内存空间,因而常规的内存分配已经不需要GlobalLock了,看看MSDN就知道该函数主要就是为DDE和剪贴板服务的。

二、操作文本数据

1、复制文本数据

void CopyText(const QString & test)
{
    if (OpenClipboard(nullptr))//打开剪贴板
    {
        HANDLE hClip;
        char* pBuf;
        EmptyClipboard();//清空剪贴板
        //写入数据
        hClip = GlobalAlloc(GMEM_MOVEABLE, test.size() + 1);
        pBuf = (char *)GlobalLock(hClip);
        strcpy(pBuf, test.toStdString().c_str());
        GlobalUnlock(hClip);//解锁
        SetClipboardData(CF_TEXT, hClip);//设置格式

        //关闭剪贴板
        CloseClipboard();
    }
}

2、粘贴文本数据

QString PasteText()
{
    QString data;
    if (OpenClipboard(nullptr))//打开剪贴板  
    {  
        if (IsClipboardFormatAvailable(CF_TEXT))//判断格式是否是我们所需要  
        {  
            HANDLE hClip;  
            char * pBuf;  
            //读取数据  
            hClip = GetClipboardData(CF_TEXT);  
            pBuf = (char*)GlobalLock(hClip);  
            GlobalUnlock(hClip);  
            CloseClipboard(); 

            data.append(pBuf);
        }  
    } 

    return data;
}

三、操作文件

1、复制文件

#include <string.h>
#include <windows.h>
#include <shlobj.h>

void CutOrCopyFiles(const char * lpBuffer, uint uBufLen, bool bCopy)
{
    UINT uDropEffect;
    DROPFILES dropFiles;
    UINT uGblLen, uDropFilesLen;
    HGLOBAL hGblFiles, hGblEffect;
    char *szData, *szFileList;

    DWORD *dwDropEffect;

    uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
    hGblEffect = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
    dwDropEffect = (DWORD *)GlobalLock(hGblEffect);
    if(bCopy)
        *dwDropEffect = DROPEFFECT_COPY;
    else 
        *dwDropEffect = DROPEFFECT_MOVE;
    GlobalUnlock(hGblEffect);

    uDropFilesLen = sizeof(DROPFILES);
    dropFiles.pFiles = uDropFilesLen;
    dropFiles.pt.x = 0;
    dropFiles.pt.y = 0;
    dropFiles.fNC = FALSE;
    dropFiles.fWide = TRUE;

    uGblLen = uDropFilesLen + uBufLen * 2 + 8;
    hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, uGblLen);
    szData = (char *)GlobalLock(hGblFiles);
    memcpy(szData,(LPVOID)(&dropFiles), uDropFilesLen);
    szFileList = szData + uDropFilesLen;

    MultiByteToWideChar(CP_ACP, MB_COMPOSITE,
        lpBuffer, uBufLen, (WCHAR *)szFileList, uBufLen);

    GlobalUnlock(hGblFiles);

    if( OpenClipboard(NULL) )
    {
        EmptyClipboard();
        SetClipboardData(CF_HDROP, hGblFiles );
        SetClipboardData(uDropEffect, hGblEffect);
        CloseClipboard();
    }
}

2、粘贴文件

void PasteFile()
{
    UINT uDropEffect = RegisterClipboardFormat("Preferred DropEffect");

    if(OpenClipboard( nullptr))
    {    
        HDROP hDrop = HDROP( GetClipboardData( CF_HDROP));
        if(hDrop) 
        {
            DWORD dwEffect, *dw;
            dw = (DWORD *)(GetClipboardData( uDropEffect));
            if(dw == NULL)
                dwEffect = DROPEFFECT_COPY;
            else
                dwEffect = *dw;

            char Buf[4096];
            Buf[0] = 0;
            UINT cFiles = DragQueryFile( hDrop, (UINT) -1, NULL, 0);
            POINT Point;
            char szFile[ MAX_PATH];
            for(UINT count = 0; count < cFiles; ++count) 
            {
                DragQueryFile( hDrop, count, szFile, sizeof( szFile));
                lstrcat(Buf,szFile);
                lstrcat(Buf," ");
            }

            if(dwEffect & DROPEFFECT_MOVE) 
            {
                MessageBox(NULL, Buf, "Move Files", MB_OK);
            } else    if(dwEffect & DROPEFFECT_COPY) 
            {
                MessageBox(NULL, Buf, "Copy Files", MB_OK);
            }

            CloseClipboard();
        }
    } 
}

四、参考文章

  1. 如何与资源管理器互动剪切/拷贝/粘贴文件[VC++]:文件操作
  2. C++操作剪贴板具体应用方式解析:文本操作
  3. WINDOWS API——OPENCLIPBOARD——剪切板:操作函数说明

如果您觉得文章不错,不妨给个 打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!




很重要–转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords

  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值