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++操作剪贴板具体应用方式解析:文本操作