一、粘贴板操作函数
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"); 注册数据类型详细函数阅读:
往剪贴板中放的数据必须是内存对象: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 #include2 #include 3 #include 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 else15 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 }
四、参考文章
:文件操作
:文本操作
:操作函数说明