windows粘贴板操作-自己的应用和windows右键互动
一、粘贴板操作函数
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右键互动的更多相关文章
- (转)Python 操作 Windows 粘贴板
转自: http://outofmemory.cn/code-snippet/3939/Python-operation-Windows-niantie-board Python 操作 Windows ...
- AX 利用windows粘贴板功能实现批量数据快速导出EXCEL
static void test(Args _args) { int lineNum; int titleLines; SysExcelApplication excel; SysExcelWorkb ...
- tmux复制到windows剪贴板/粘贴板的坑
以下所有操作都是在windows下面用putty连接linux centos6的情景下. 一直很纳闷为什么在tmux模式下不能把复制到的文字放到系统的粘贴板里面呢?通过层层阻碍,终于找到了原因. 去掉 ...
- IE中操作粘贴板复制和粘贴
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- windows系统快捷操作の基础篇
从网上汇总了一些windows系统上常用的快捷键,结合自己的使用经验,将平时使用电脑时最常用的快捷键记录在此.注意这里罗列的是平时最常用到的,其他的一般来说不怎么用到的并不在此列,如果想要完整列表,请 ...
- 如何拷贝CMD命令行文本到粘贴板
/********************************************************************* * 如何拷贝CMD命令行文本到粘贴板 * To copy ...
- IOS 访问系统粘贴板
粘贴板提供了一种核心OS特性,用于跨应用程序共享数据.用户可以跨应用来复制粘贴,也可以设置只在本应用中复制粘贴用来保护隐私. UIPasteboard类允许访问共享的设备粘贴板以及内容,下面代码返回一 ...
- vim中使用系统粘贴板
在vim中如果想使用系统粘贴板,也就是说,如果你在其他程序中复制内容,那么使用shift+insert组合键就可以粘贴进来. 需要说明的是,vim中的粘贴板有很多,你可以输入 :reg来进行查看.而我 ...
- js插件实现点击复制内容到粘贴板,兼容IE8
先来看下本次需要导入的文件: 第一个是jquery.js,这个不多说: 第二个是jquery.zclip.js,第三个是zeroClipboard.swf ,这两个文件的下载链接:http://www ...
随机推荐
- Key-Value Store Indexer(Lily HBase Indexer) 小型采坑
环境: Cloudera Express 5.12.1 JDK 1.8.0_92 CentOS 7 步骤1:数据导入到Hbase中(非正题,跳过) hbase中表为allDoc,两个Family:fu ...
- Dynamic 中修改实体中主字段的长度
select EntityId,* from MetadataSchema.Entity where Name='dji_incidentaddress' SELECT TOP 100 [Attrib ...
- 关于JAVA中异常处理的简单阐释.
---恢复内容开始--- 这是我的一篇要在博客园发布的随笔,主要是简单的概括一下我本次所学的关于异常处理的知识.有讲的不妥当的地方,或者有需要补充的,还请各位高人给指点,共同学习,虚心求学.谢谢啦~ ...
- Flask入门之SQLAlchemy数据库连接操作(第15讲)
一.库安装 Flask-SQLAlchemy 2 SQLAlchemy 1.0.8 二.进入venv 三.切换到项目Sample\ 文件夹,进入manager.py 的shell python man ...
- JS入门熟知
JS是面向对象的语言 封装 继承 多态 聚集(对象中具有引用其他对象的能力) JS使用中绝大多数情况不需要进行面向对象的设计,很多情况是使用已经设计好,准备好的对象,基于对象的语言. JS的使用(引入 ...
- SignalR网页实时推送
1.新建项目,选择mvc4 Wed应用程序,选择Internet,视图引擎:Razor 2.在控制器中添加 并添加上视图 3.引用(install-package Microsoft.AspNet.S ...
- 微信对账单处理-PHP
最近要做支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款 ...
- DX11 Without DirectX SDK--01 DirectX11初始化
回到 DirectX11--使用Windows SDK来进行开发 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过 ...
- py文件转换为exe文件
遇到这个问题时在网上找了一会资料,很多博客的方法很旧了,介绍一种最简单的,pyinstaller. 时间比较早的资料还在介绍如何安装pip(python的包管理器),其实python中已经自带pip了 ...
- Python实现猜数字游戏1.0版
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=702 """ 功能: 随机生成一个数字,最多有3次猜测机会,如果第一次没有猜对,则从第 ...