将整个文件复制到剪贴板,注意是文件不是文本内容,麻烦用c++实现(最好可以别用MFC),谢谢了!

 我来答
hl_zh
2011-03-03 · TA获得超过738个赞
知道小有建树答主
回答量:204
采纳率:0%
帮助的人:346万
展开全部
#include <string.h>
#include <windows.h>
#include <shlobj.h>

//复制文件到剪贴板
//没有加入错误判断,请自行修改
int CopyFileToClipboard(char szFileName[]);

int main()
{
CopyFileToClipboard("D:\\user.txt");

return 0;
}

int CopyFileToClipboard(char szFileName[])
{
UINT uDropEffect;
HGLOBAL hGblEffect;
LPDWORD lpdDropEffect;
DROPFILES stDrop;

HGLOBAL hGblFiles;
LPSTR lpData;

uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
hGblEffect = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE,sizeof(DWORD));
lpdDropEffect = (LPDWORD)GlobalLock(hGblEffect);
*lpdDropEffect = DROPEFFECT_COPY;//复制; 剪贴则用DROPEFFECT_MOVE
GlobalUnlock(hGblEffect);

stDrop.pFiles = sizeof(DROPFILES);
stDrop.pt.x = 0;
stDrop.pt.y = 0;
stDrop.fNC = FALSE;
stDrop.fWide = FALSE;

hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE,\
sizeof(DROPFILES)+strlen(szFileName)+2);
lpData = (LPSTR)GlobalLock(hGblFiles);
memcpy(lpData,&stDrop,sizeof(DROPFILES));
strcpy(lpData+sizeof(DROPFILES),szFileName);
GlobalUnlock(hGblFiles);

OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_HDROP,hGblFiles);
SetClipboardData(uDropEffect,hGblEffect);
CloseClipboard();

return 1;
}
追问
先谢谢你了,因为程序运行很成功,可以再给个注释吗?稍微解释一下,我可以给你加分,如果没兴趣的话,你回复下,我也把分给你了,谢谢!
追答
int CopyFileToClipboard(char szFileName[])
{
UINT uDropEffect;
HGLOBAL hGblEffect;
LPDWORD lpdDropEffect;
DROPFILES stDrop;

HGLOBAL hGblFiles;
LPSTR lpData;

//与剪贴板交互的数据格式并非标准剪贴板格式,因此需要注册
uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
//为剪贴板数据分配空间
hGblEffect = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE,sizeof(DWORD));
lpdDropEffect = (LPDWORD)GlobalLock(hGblEffect);
//设置操作的模式
*lpdDropEffect = DROPEFFECT_COPY;//复制; 剪贴则用DROPEFFECT_MOVE
GlobalUnlock(hGblEffect);

//剪贴板数据需要一个这个结构
stDrop.pFiles = sizeof(DROPFILES);//文件列表相对于结构的偏移量
stDrop.pt.x = 0;
stDrop.pt.y = 0;
stDrop.fNC = FALSE;
stDrop.fWide = FALSE;//宽字符设置

//分配数据空间,并且预留文件名的空间
//文件列表为两个'\0'结尾,因此需要多分配2个字节
hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE,\
sizeof(DROPFILES)+strlen(szFileName)+2);

lpData = (LPSTR)GlobalLock(hGblFiles);
memcpy(lpData,&stDrop,sizeof(DROPFILES));
strcpy(lpData+sizeof(DROPFILES),szFileName);
GlobalUnlock(hGblFiles);

//普通的剪贴板操作
OpenClipboard(NULL);
EmptyClipboard();
//设置剪贴板文件信息
SetClipboardData(CF_HDROP,hGblFiles);
//设置剪贴板操作信息
SetClipboardData(uDropEffect,hGblEffect);
CloseClipboard();

return 1;
}

可以搜索一下其中的一些字符串,可以得到更好更深入的理解。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式