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

  • Post author:
  • Post category:其他


最近有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中亲测可用,不过可能会有些配置类型的错误的提示,参考提示或者百度很容易解决的,这里不细说,有需要帮助的可以评论咨询

以上,记录!



版权声明:本文为Yoryky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。