gusucode.com > VC一个剪贴板与资源管理器共享数据示例-源码程序 > VC一个剪贴板与资源管理器共享数据示例-源码程序\code\cutcopy.cpp
//Download by http://www.NewXing.com #include <windows.h> #include <Shellapi.h> #include <Shlobj.h> #include <oleidl.h> #include "resource.h" LRESULT CALLBACK MainProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ); BOOL CheckClipboard(HWND hWnd,LPTSTR lpBuffer); VOID CutOrCopyFiles(char *lpBuffer,UINT uBufLen,BOOL bCopy); BOOL SelectFiles(HWND hWnd,LPTSTR lpBuffer,DWORD dwSize); HINSTANCE g_hInst; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd; MSG msg; g_hInst=hInstance; hWnd = CreateDialog( hInstance, MAKEINTRESOURCE( IDD_MAINWIN ), HWND_DESKTOP, (DLGPROC)MainProc ); while ( GetMessage( &msg, NULL, 0, 0 ) ) { if ( !IsDialogMessage( hWnd, &msg ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } return msg.wParam; } LRESULT CALLBACK MainProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ) { TCHAR szBuffer[4096],*lp,*lpStart; TCHAR szFiles[4096],*lpFileStart; UINT uLen,uTotalLen=0; switch(uMessage) { case WM_COMMAND : switch(LOWORD(wParam)) { case IDC_CHECK: memset(szBuffer,0,4096*sizeof(TCHAR)); if(CheckClipboard(hWnd,szBuffer)) { SetWindowText(GetDlgItem(hWnd,IDC_FILES),szBuffer); } break; case IDC_CUT : case IDC_COPY : memset(szBuffer,0,4096*sizeof(TCHAR)); GetWindowText(GetDlgItem(hWnd,IDC_FILES),szBuffer,4096); if(*szBuffer!=0) { //把文本筐中的文件名整理成要求的格式:"file1\0File2\0" memset(szFiles,0,4096*sizeof(TCHAR)); lpFileStart=szFiles; //下个文件名存放位置指针 lpStart=szBuffer; //当前正在整理的文件名首地址 lp=szBuffer; while(*lp!=0) { if(*lp=='\r') { //到达文件名末尾 *lp=0; //将回车符号换成0 lstrcat(lpFileStart,lpStart); uLen=lstrlen(lpStart)+1; lpFileStart+=uLen; uTotalLen+=uLen; lp++;//跳过'\n' lpStart=lp+1; } lp++; } //Cut/Copy File if(LOWORD(wParam)==IDC_COPY) CutOrCopyFiles(szFiles,uTotalLen,TRUE); else CutOrCopyFiles(szFiles,uTotalLen,FALSE); } break; case IDC_EXIT : PostQuitMessage(0); break; case IDC_BROWSER : memset(szBuffer,0,4096*sizeof(TCHAR)); SelectFiles(hWnd,szBuffer,4096); if(*szBuffer!=0) { //将选择的文件整理成全路径字符串(以换行分割文件名) //如果只选择了一个文件,szBuffer中就是全名 //如果选择多个文件,则格式为:"路径名\0文件1\0文件2\0" memset(szFiles,0,4096*sizeof(TCHAR)); uLen=lstrlen(szBuffer)+1; lp=szBuffer+uLen; lpStart=szBuffer+uLen; while((*lp!=0 || *(lp+1)!=0) || *lpStart!=0 ) { if(*lp==0) { lstrcat(szFiles,szBuffer);//copy路径, lstrcat(szFiles,"\\"); lstrcat(szFiles,lpStart);//加上文件名 lstrcat(szFiles,"\r\n");//用换行隔开 lpStart=lp+1; } lp++; } if(*szFiles==0) { //只选择了一个文件 lstrcpy(szFiles,szBuffer); lstrcat(szFiles,"\r\n"); } SetWindowText(GetDlgItem(hWnd,IDC_FILES),szFiles); } break; } break; case WM_CLOSE : PostQuitMessage(0); break; } return 0; } BOOL CheckClipboard(HWND hWnd,LPTSTR lpBuffer) { UINT uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); UINT cFiles=0; DWORD dwEffect,*dw; if( OpenClipboard( hWnd)) { HDROP hDrop = HDROP( GetClipboardData( CF_HDROP)); if( hDrop) { dw=(DWORD*)(GetClipboardData( uDropEffect)); if(dw==NULL) dwEffect=DROPEFFECT_COPY; else dwEffect=*dw; cFiles = DragQueryFile( hDrop, (UINT) -1, NULL, 0); char szFile[ MAX_PATH]; for( UINT count = 0; count < cFiles; count++ ) { DragQueryFile( hDrop, count, szFile, sizeof( szFile)); lstrcat(lpBuffer,szFile); lstrcat(lpBuffer,"\r\n"); } } CloseClipboard(); if(dwEffect & DROPEFFECT_MOVE) { MessageBox(NULL,lpBuffer,"Move Files",MB_OK); } else if(dwEffect & DROPEFFECT_COPY) { MessageBox(NULL,lpBuffer,"Copy Files",MB_OK); } } if(cFiles==0) { MessageBox(NULL,"No File will be Cut/Copy","Information",MB_OK); return FALSE; } return TRUE; } VOID CutOrCopyFiles(char *lpBuffer,UINT uBufLen,BOOL bCopy) { UINT uDropEffect; DROPFILES dropFiles; UINT uGblLen,uDropFilesLen; HGLOBAL hGblFiles,hGblEffect; char *szData,*szFileList; DWORD *dwDropEffect; uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD)); dwDropEffect=(DWORD*)GlobalLock(hGblEffect); if(bCopy) *dwDropEffect=DROPEFFECT_COPY; else *dwDropEffect=DROPEFFECT_MOVE; GlobalUnlock(hGblEffect); uDropFilesLen=sizeof(DROPFILES); dropFiles.pFiles =uDropFilesLen; dropFiles.pt.x=0; dropFiles.pt.y=0; dropFiles.fNC =FALSE; dropFiles.fWide =TRUE; uGblLen=uDropFilesLen+uBufLen*2+8; hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen); szData=(char*)GlobalLock(hGblFiles); memcpy(szData,(LPVOID)(&dropFiles),uDropFilesLen); szFileList=szData+uDropFilesLen; MultiByteToWideChar(CP_ACP,MB_COMPOSITE, lpBuffer,uBufLen,(WCHAR *)szFileList,uBufLen); GlobalUnlock(hGblFiles); if( OpenClipboard(NULL) ) { EmptyClipboard(); SetClipboardData( CF_HDROP, hGblFiles ); SetClipboardData(uDropEffect,hGblEffect); CloseClipboard(); } } BOOL SelectFiles(HWND hWnd,LPTSTR lpBuffer,DWORD dwSize) { OPENFILENAME OpenFileName; TCHAR szTitle[50]="Select Files for Cut/Copy\0",szFilter[20]=TEXT("*.*\0"); ZeroMemory(szTitle,50); ZeroMemory(lpBuffer,dwSize); ZeroMemory((LPVOID)&OpenFileName,sizeof(OPENFILENAME)); OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.hwndOwner = hWnd; OpenFileName.hInstance = g_hInst; OpenFileName.lpstrFile = lpBuffer; OpenFileName.nMaxFile = dwSize; OpenFileName.lpstrFilter =szFilter; OpenFileName.nFilterIndex =1; OpenFileName.lpstrTitle = szTitle; OpenFileName.Flags =OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; return GetOpenFileName(&OpenFileName); }