首页
社区
课程
招聘
[求助]如何复制文件/文件夹到剪贴板?
发表于: 2013-4-15 22:13 4956

[求助]如何复制文件/文件夹到剪贴板?

2013-4-15 22:13
4956
请问怎么实现向windows桌面那样:在某个文件或文件夹上选复制或剪切就可以把相关信息放入剪贴板中,然后在某个地方选粘贴就能实现粘贴呢?

我的项目中把文件文件夹的图标名称都放到了listview中了,右键想添加个剪切复制的功能,应该是先把文件或文件夹存入剪贴板,然后在其他目录按下ctrl+v自动粘贴吧,现在的问题是如何把某个文件或文件夹放入到剪贴板呢?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
2
一个小例子,自己看
#include <Windows.h>
#include <Stdio.h>
#include <Tchar.h>
#include <ShlObj.h>

HANDLE GetHandleByFiles(LPCTSTR pszFileList, INT cbFileList, BOOL fWide)
{
	LPVOID			lpvBuf;
	DROPFILES		dropFiles;
	HGLOBAL			hGblFiles;
	INT				nGblFiles;
	
	//填充DROPFILES结构
	dropFiles.pFiles = sizeof(DROPFILES);//DROPFILES结构的长度
	dropFiles.pt.x = 0; //文件拖放的位置坐标x
	dropFiles.pt.y = 0;//文件拖放的位置坐标y
	dropFiles.fNC = FALSE;//pt值是否为客户区坐标(FALSE表明是屏幕坐标)
	dropFiles.fWide = fWide;//是否是宽字符

	nGblFiles = sizeof(DROPFILES) + cbFileList;
	hGblFiles = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, nGblFiles);

	lpvBuf = (LPTSTR)GlobalLock(hGblFiles);
	memcpy(lpvBuf, &dropFiles, sizeof(DROPFILES));
	memcpy((LPSTR)lpvBuf + sizeof(DROPFILES), pszFileList, cbFileList);
	GlobalUnlock(hGblFiles);

	return hGblFiles;
}

HANDLE GetCutOrCopyHandle(BOOL bCopy)
{
	LPDWORD			lpDropEffect;
	HGLOBAL			hGblEffect;

	hGblEffect = GlobalAlloc(GMEM_MOVEABLE| GMEM_DDESHARE, sizeof(DWORD));

	lpDropEffect = (LPDWORD)GlobalLock(hGblEffect);
	if (bCopy)
		*lpDropEffect = DROPEFFECT_COPY;
	else
		*lpDropEffect = DROPEFFECT_MOVE;
	GlobalUnlock(hGblEffect);

	return hGblEffect;
}

VOID SetClipBoardFiles(HWND hWnd, HGLOBAL hGblFiles, HGLOBAL hGblEffect)
{
	UINT			uiFormat;
		
	uiFormat = RegisterClipboardFormat(_T("Preferred DropEffect"));
	if(OpenClipboard(hWnd))
	{
		//先清空剪贴板
		EmptyClipboard();
		//设置剪贴板内容
		SetClipboardData(CF_HDROP, hGblFiles);
		SetClipboardData(uiFormat, hGblEffect);		
		CloseClipboard();
	}
}

int _tmain(
	int argc,
	TCHAR *argv[]
)
{
	//假说你要复制C盘的dfg目录,和123.txt
	TCHAR			szFileList[] = "C:\\dfg\0C:\\123.txt\0\0";//文件列表,多个文件以零相隔,以两个零结尾
	HGLOBAL			hGblFiles;
	HGLOBAL			hGblEffect;

#ifdef UNICODE
	hGblFiles = GetHandleByFiles(szFileList, sizeof(szFileList), TRUE);//将文件列表转换成句柄
#else
	hGblFiles = GetHandleByFiles(szFileList, sizeof(szFileList), FALSE);//将文件列表转换成句柄
#endif
	hGblEffect = GetCutOrCopyHandle(TRUE);//是剪切还是复制文件列表里面的文件
	SetClipBoardFiles(GetConsoleWindow(), hGblFiles, hGblEffect);//设置到剪贴板上

	return 0;
}
2013-4-16 07:27
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
感谢帅哥!!昨天也找了一些资料,这里一并附上吧。
http://www.vckbase.com/index.php/wv/261.html
2013-4-16 10:17
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark,收藏备用
2013-4-16 12:03
0
游客
登录 | 注册 方可回帖
返回
//