一、粘贴板操作函数

BOOL OpenClipboard(HWND hWnd);参数 hWnd 是打开剪贴板的窗口句柄,成功返回TRUE,失败返回FALSE
BOOL CloseClipboard();关闭剪贴板
BOOL EmptyClipboard();清空剪贴板
HANDLE SetClipboardData(CF_HDROP, hGblFiles );往剪切板设置数据
HANDLE GetClipboardData(UINT uFormat); 得到剪贴板中的数据,uFormat是所需要数据的格式,例如本文拖放对象的格式为CF_HDROP
UINT uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); 注册数据类型

详细函数阅读:WINDOWS API——OPENCLIPBOARD——剪切板

往剪贴板中放的数据必须是内存对象:HGLOBAL。这个对象可以通过GlobalAlloc来生成。然后使用GlobalLock就可以得到该对象的内存地址,继而往里面写 数据。实际上在Win32中由于进程拥有独立的内存空间,因而常规的内存分配已经不需要GlobalLock了,看看MSDN就知道该函数主要就是为DDE和剪贴板服务的。

二、操作文本数据

1、复制文本数据

 void CopyText(const QString & test)
{
if (OpenClipboard(nullptr))//打开剪贴板
{
HANDLE hClip;
char* pBuf;
EmptyClipboard();//清空剪贴板
//写入数据
hClip = GlobalAlloc(GMEM_MOVEABLE, test.size() + );
pBuf = (char *)GlobalLock(hClip);
strcpy(pBuf, test.toStdString().c_str());
GlobalUnlock(hClip);//解锁
SetClipboardData(CF_TEXT, hClip);//设置格式 //关闭剪贴板
CloseClipboard();
}
}

2、粘贴文本数据

 QString PasteText()
{
QString data;
if (OpenClipboard(nullptr))//打开剪贴板
{
if (IsClipboardFormatAvailable(CF_TEXT))//判断格式是否是我们所需要
{
HANDLE hClip;
char * pBuf;
//读取数据
hClip = GetClipboardData(CF_TEXT);
pBuf = (char*)GlobalLock(hClip);
GlobalUnlock(hClip);
CloseClipboard(); data.append(pBuf);
}
} return data;
}

三、操作文件

1、复制文件

 #include <string.h>
#include <windows.h>
#include <shlobj.h> void CutOrCopyFiles(const char * lpBuffer, uint uBufLen, bool bCopy)
{
UINT uDropEffect;
DROPFILES dropFiles;
UINT uGblLen, uDropFilesLen;
HGLOBAL hGblFiles, hGblEffect;
char *szData, *szFileList; DWORD *dwDropEffect; uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
hGblEffect = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
dwDropEffect = (DWORD *)GlobalLock(hGblEffect);
if(bCopy)
*dwDropEffect = DROPEFFECT_COPY;
else
*dwDropEffect = DROPEFFECT_MOVE;
GlobalUnlock(hGblEffect); uDropFilesLen = sizeof(DROPFILES);
dropFiles.pFiles = uDropFilesLen;
dropFiles.pt.x = ;
dropFiles.pt.y = ;
dropFiles.fNC = FALSE;
dropFiles.fWide = TRUE; uGblLen = uDropFilesLen + uBufLen * + ;
hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, uGblLen);
szData = (char *)GlobalLock(hGblFiles);
memcpy(szData,(LPVOID)(&dropFiles), uDropFilesLen);
szFileList = szData + uDropFilesLen; MultiByteToWideChar(CP_ACP, MB_COMPOSITE,
lpBuffer, uBufLen, (WCHAR *)szFileList, uBufLen); GlobalUnlock(hGblFiles); if( OpenClipboard(NULL) )
{
EmptyClipboard();
SetClipboardData(CF_HDROP, hGblFiles );
SetClipboardData(uDropEffect, hGblEffect);
CloseClipboard();
}
}

2、粘贴文件

 void PasteFile()
{
UINT uDropEffect = RegisterClipboardFormat("Preferred DropEffect"); if(OpenClipboard( nullptr))
{
HDROP hDrop = HDROP( GetClipboardData( CF_HDROP));
if(hDrop)
{
DWORD dwEffect, *dw;
dw = (DWORD *)(GetClipboardData( uDropEffect));
if(dw == NULL)
dwEffect = DROPEFFECT_COPY;
else
dwEffect = *dw; char Buf[];
Buf[] = ;
UINT cFiles = DragQueryFile( hDrop, (UINT) -, NULL, );
POINT Point;
char szFile[ MAX_PATH];
for(UINT count = ; count < cFiles; ++count)
{
DragQueryFile( hDrop, count, szFile, sizeof( szFile));
lstrcat(Buf,szFile);
lstrcat(Buf," ");
} if(dwEffect & DROPEFFECT_MOVE)
{
MessageBox(NULL, Buf, "Move Files", MB_OK);
} else if(dwEffect & DROPEFFECT_COPY)
{
MessageBox(NULL, Buf, "Copy Files", MB_OK);
} CloseClipboard();
}
}
}

四、参考文章

  如何与资源管理器互动剪切/拷贝/粘贴文件[VC++]:文件操作

  C++操作剪贴板具体应用方式解析:文本操作

  WINDOWS API——OPENCLIPBOARD——剪切板:操作函数说明

windows粘贴板操作-自己的应用和windows右键互动的更多相关文章

  1. (转)Python 操作 Windows 粘贴板

    转自: http://outofmemory.cn/code-snippet/3939/Python-operation-Windows-niantie-board Python 操作 Windows ...

  2. AX 利用windows粘贴板功能实现批量数据快速导出EXCEL

    static void test(Args _args) { int lineNum; int titleLines; SysExcelApplication excel; SysExcelWorkb ...

  3. tmux复制到windows剪贴板/粘贴板的坑

    以下所有操作都是在windows下面用putty连接linux centos6的情景下. 一直很纳闷为什么在tmux模式下不能把复制到的文字放到系统的粘贴板里面呢?通过层层阻碍,终于找到了原因. 去掉 ...

  4. IE中操作粘贴板复制和粘贴

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. windows系统快捷操作の基础篇

    从网上汇总了一些windows系统上常用的快捷键,结合自己的使用经验,将平时使用电脑时最常用的快捷键记录在此.注意这里罗列的是平时最常用到的,其他的一般来说不怎么用到的并不在此列,如果想要完整列表,请 ...

  6. 如何拷贝CMD命令行文本到粘贴板

    /********************************************************************* * 如何拷贝CMD命令行文本到粘贴板 * To copy ...

  7. IOS 访问系统粘贴板

    粘贴板提供了一种核心OS特性,用于跨应用程序共享数据.用户可以跨应用来复制粘贴,也可以设置只在本应用中复制粘贴用来保护隐私. UIPasteboard类允许访问共享的设备粘贴板以及内容,下面代码返回一 ...

  8. vim中使用系统粘贴板

    在vim中如果想使用系统粘贴板,也就是说,如果你在其他程序中复制内容,那么使用shift+insert组合键就可以粘贴进来. 需要说明的是,vim中的粘贴板有很多,你可以输入 :reg来进行查看.而我 ...

  9. js插件实现点击复制内容到粘贴板,兼容IE8

    先来看下本次需要导入的文件: 第一个是jquery.js,这个不多说: 第二个是jquery.zclip.js,第三个是zeroClipboard.swf ,这两个文件的下载链接:http://www ...

随机推荐

  1. HTML5学习系列之表单与文件

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容.它可以是一篇博客或报刊中的文章.一篇论坛帖子.一段用户评论或独立的插件,或者其他任何独立的内容 ...

  2. Scala编程入门---数组操作之Array.ArrayBuffer以及遍历数组

    在Scala中,Array代表的含义与Java类似,也是长度不可改变的数组.此外,由于Scala与java都是运行在JVM中,双方可以互相调用,因此Scala数组底层实际上是java数组.列如字符串数 ...

  3. Redis实际开发中常见问题

    首先redis作为缓存,一般作为缓存有2个用途,快速访问和减少IO频率,所谓减少IO频率就是等缓存积累到一定大小然后一次刷入磁盘进行持久化. 一般的设计就是客户端往数据库里更新或者读写数据,redis ...

  4. mysql 关于表与字段的增删改查操作

    1.mysql 命令登陆 形式: mysql -u用户名 -p密码 mysql -uroot -proot 2.mysql 显示数据库 形式: show databases; 3.mysql 进入某一 ...

  5. AE的空间分析(转载)

    1.1 ITopologicalOperator接口 1.1.1 ITopologicalOperator接口简介ITopologicalOperator接口用来通过对已存在的几何对象做空间拓扑运算以 ...

  6. 架构之Nginx(负载均衡/反向代理)

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器 ,也是一个 IMAP/POP3/SMTP 代理 服务器 . Nginx 是由 Igor Sys ...

  7. python while 循环语句

    Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句-- 执行语句可以是单个语句或语句 ...

  8. CSS学习笔记三:自定义单选框,复选框,开关

    一点一点学习CCS,这次学习了如何自定义单选框,复选框以及开关. 一.单选框 1.先写好body里面的样式,先写几个框 <body> <div class="radio-1 ...

  9. MySQL常见备份方案

    MySQL常见备份方案有以下三种: mysqldump + binlog lvm + binlog xtrabackup 本例为方便演示,数据库里面数据为空.下面开始动手 mkdir /opt/bac ...

  10. mybatis自定义代码生成器(Generator)——自动生成model&dao代码

    花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...