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——剪切板:操作函数说明

posted @ 2018-07-20 17:14  朝十晚八  阅读(1582)  评论(0编辑  收藏  举报

返回顶部