• 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、复制文本数据

     1 void CopyText(const QString & test)
     2 {
     3     if (OpenClipboard(nullptr))//打开剪贴板
     4     {
     5         HANDLE hClip;
     6         char* pBuf;
     7         EmptyClipboard();//清空剪贴板
     8         //写入数据
     9         hClip = GlobalAlloc(GMEM_MOVEABLE, test.size() + 1);
    10         pBuf = (char *)GlobalLock(hClip);
    11         strcpy(pBuf, test.toStdString().c_str());
    12         GlobalUnlock(hClip);//解锁
    13         SetClipboardData(CF_TEXT, hClip);//设置格式
    14 
    15         //关闭剪贴板
    16         CloseClipboard();
    17     }
    18 }

    2、粘贴文本数据

     1 QString PasteText()
     2 {
     3     QString data;
     4     if (OpenClipboard(nullptr))//打开剪贴板  
     5     {  
     6         if (IsClipboardFormatAvailable(CF_TEXT))//判断格式是否是我们所需要  
     7         {  
     8             HANDLE hClip;  
     9             char * pBuf;  
    10             //读取数据  
    11             hClip = GetClipboardData(CF_TEXT);  
    12             pBuf = (char*)GlobalLock(hClip);  
    13             GlobalUnlock(hClip);  
    14             CloseClipboard(); 
    15 
    16             data.append(pBuf);
    17         }  
    18     } 
    19 
    20     return data;
    21 }

    三、操作文件

    1、复制文件

     1 #include <string.h>
     2 #include <windows.h>
     3 #include <shlobj.h>
     4 
     5 void CutOrCopyFiles(const char * lpBuffer, uint uBufLen, bool bCopy)
     6 {
     7     UINT uDropEffect;
     8     DROPFILES dropFiles;
     9     UINT uGblLen, uDropFilesLen;
    10     HGLOBAL hGblFiles, hGblEffect;
    11     char *szData, *szFileList;
    12 
    13     DWORD *dwDropEffect;
    14 
    15     uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
    16     hGblEffect = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
    17     dwDropEffect = (DWORD *)GlobalLock(hGblEffect);
    18     if(bCopy)
    19         *dwDropEffect = DROPEFFECT_COPY;
    20     else 
    21         *dwDropEffect = DROPEFFECT_MOVE;
    22     GlobalUnlock(hGblEffect);
    23 
    24     uDropFilesLen = sizeof(DROPFILES);
    25     dropFiles.pFiles = uDropFilesLen;
    26     dropFiles.pt.x = 0;
    27     dropFiles.pt.y = 0;
    28     dropFiles.fNC = FALSE;
    29     dropFiles.fWide = TRUE;
    30 
    31     uGblLen = uDropFilesLen + uBufLen * 2 + 8;
    32     hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, uGblLen);
    33     szData = (char *)GlobalLock(hGblFiles);
    34     memcpy(szData,(LPVOID)(&dropFiles), uDropFilesLen);
    35     szFileList = szData + uDropFilesLen;
    36 
    37     MultiByteToWideChar(CP_ACP, MB_COMPOSITE,
    38         lpBuffer, uBufLen, (WCHAR *)szFileList, uBufLen);
    39 
    40     GlobalUnlock(hGblFiles);
    41 
    42     if( OpenClipboard(NULL) )
    43     {
    44         EmptyClipboard();
    45         SetClipboardData(CF_HDROP, hGblFiles );
    46         SetClipboardData(uDropEffect, hGblEffect);
    47         CloseClipboard();
    48     }
    49 }

    2、粘贴文件

     1 void PasteFile()
     2 {
     3     UINT uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
     4 
     5     if(OpenClipboard( nullptr))
     6     {    
     7         HDROP hDrop = HDROP( GetClipboardData( CF_HDROP));
     8         if(hDrop) 
     9         {
    10             DWORD dwEffect, *dw;
    11             dw = (DWORD *)(GetClipboardData( uDropEffect));
    12             if(dw == NULL)
    13                 dwEffect = DROPEFFECT_COPY;
    14             else
    15                 dwEffect = *dw;
    16 
    17             char Buf[4096];
    18             Buf[0] = 0;
    19             UINT cFiles = DragQueryFile( hDrop, (UINT) -1, NULL, 0);
    20             POINT Point;
    21             char szFile[ MAX_PATH];
    22             for(UINT count = 0; count < cFiles; ++count) 
    23             {
    24                 DragQueryFile( hDrop, count, szFile, sizeof( szFile));
    25                 lstrcat(Buf,szFile);
    26                 lstrcat(Buf," ");
    27             }
    28 
    29             if(dwEffect & DROPEFFECT_MOVE) 
    30             {
    31                 MessageBox(NULL, Buf, "Move Files", MB_OK);
    32             } else    if(dwEffect & DROPEFFECT_COPY) 
    33             {
    34                 MessageBox(NULL, Buf, "Copy Files", MB_OK);
    35             }
    36 
    37             CloseClipboard();
    38         }
    39     } 
    40 }

    四、参考文章

      如何与资源管理器互动剪切/拷贝/粘贴文件[VC++]:文件操作

      C++操作剪贴板具体应用方式解析:文本操作

      WINDOWS API——OPENCLIPBOARD——剪切板:操作函数说明

  • 相关阅读:
    HTML5与HTML的区别
    0918练习整理
    0904 未来展望
    ajax弹出窗口
    AjAX请求后台,无刷新更新页面
    Jquery通过Ajax方式来提交Form表单
    php的socket通信
    次短路[SPFA]
    [Usaco2008 Open]Roads Around The Farm分岔路口[水题]
    [Usaco2008 Nov]Guarding the Farm 保卫牧场[DFS]
  • 原文地址:https://www.cnblogs.com/swarmbees/p/9342585.html
Copyright © 2020-2023  润新知