最近有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 版权协议,转载请附上原文出处链接和本声明。