本文共 1707 字,大约阅读时间需要 5 分钟。
BOOL CopyFilesToClipboard( std::vectorconst & vecFiles ){ RETURN_IF_FALSE_EX( FALSE, vecFiles.size() ); UINT uDropEffect = RegisterClipboardFormat(_T("Preferred DropEffect")); HGLOBAL hGblEffect = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, sizeof(DWORD)); DWORD *pDWDropEffect = (DWORD*)GlobalLock(hGblEffect); *pDWDropEffect = DROPEFFECT_COPY; GlobalUnlock(hGblEffect); DROPFILES dropFiles; dropFiles.pFiles = sizeof(DROPFILES); dropFiles.pt.x = 0; dropFiles.pt.y = 0; dropFiles.fNC = FALSE; dropFiles.fWide = TRUE; UINT uFileListLen = 0; for (std::vector ::const_iterator it = vecFiles.begin(); it != vecFiles.end(); ++it) { uFileListLen += (it->GetLength() + 1);//尾部一个\0结束符 } UINT uGblLen = sizeof(DROPFILES) + sizeof(TCHAR)* (uFileListLen + 1); HGLOBAL hGblFiles = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen); BYTE * pData = (BYTE*)GlobalLock(hGblFiles); memcpy(pData, (LPVOID)(&dropFiles), sizeof(DROPFILES)); BYTE *pFileList = pData + sizeof(DROPFILES); for (std::vector ::const_iterator it = vecFiles.begin(); it != vecFiles.end(); ++it) { UINT uLen = (it->GetLength() + 1) * sizeof(TCHAR); memcpy(pFileList, (BYTE*)(LPCTSTR)(*it), uLen); pFileList += uLen; } GlobalUnlock(hGblFiles); if( OpenClipboard(NULL) ) { EmptyClipboard(); SetClipboardData( CF_HDROP, hGblFiles ); SetClipboardData(uDropEffect,hGblEffect); CloseClipboard(); return TRUE; } else { ::GlobalFree(hGblEffect); ::GlobalFree(hGblFiles); } return FALSE;}
转载地址:http://xwmai.baihongyu.com/