C++操作windows剪贴板数据(含文件复制)

最近有electron项目需求,需要在electron复制windows文件到剪贴板,故研究了下electron复制文件到剪贴板的可能性,其中一种方案就是通过ffi-napi来调用了本地dll,然后在本地dll中操作剪贴板,自己写了点C++代码操作剪贴板,这里简单记录下,也希望能帮到需要的人

1、操作Text文本到剪贴板

    #include <windows.h>
    #include <iostream>
    using namespace std;
    int main()
    {
    	HWND hWnd = NULL;
    	OpenClipboard( hWnd );//打开剪切板
    	EmptyClipboard();//清空剪切板
    	HANDLE hHandle = GlobalAlloc(GMEM_FIXED, 1000);//分配内存
    	char* pData = (char*) GlobalLock(hHandle);//锁定内存,返回申请内存的首地址
    	strcpy(pData, "this is a ClipBoard Test.");
    	SetClipboardData(CF_TEXT, hHandle);//设置剪切板数据
    	GlobalUnlock(hHandle);//解除锁定
    	CloseClipboard();//关闭剪切板
     
    	OpenClipboard(hWnd);
    	EmptyClipboard();
    	if ( IsClipboardFormatAvailable(CF_TEXT) )
    	{
    		HANDLE h = GetClipboardData(CF_TEXT);//获取剪切板数据
    		char* p =  (char*)GlobalLock(h);
    		GlobalUnlock(h);
    		CloseClipboard();
    	}
    	return 0;
    }

这里具体的windows.h的剪贴板函数就不细说了,需要了解的可以参考 Windows开发人员 Clipborad

2、复制文件到剪贴板

#include <iostream>
#include <windows.h>
#include <shlobj.h>

int CopyFileToClipboard(char szFileName[]);

int main()
{
	CopyFileToClipboard("C:\\Users\\Administrator\\Desktop\\test\\hello.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;//复制; 剪贴则du用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;
}

以上代码在VS2019中亲测可用,不过可能会有些配置类型的错误的提示,参考提示或者百度很容易解决的,这里不细说,有需要帮助的可以评论咨询

以上,记录!

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值