zoukankan      html  css  js  c++  java
  • 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——剪切板:操作函数说明

  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/swarmbees/p/9342585.html
Copyright © 2011-2022 走看看