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);

}