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 ...
随机推荐
- ios WKWebView 与 JS 交互实战技巧
一.WKWebView 由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新 ...
- 详解Java的Spring框架中的注解的用法
转载:http://www.jb51.net/article/75460.htm 1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: class UserMa ...
- PHP $_FILES函数详解
原创 转载请注明出处! 先来看一段代码 <form enctype="multipart/form-data" action="upload.php" m ...
- SEO概念及SEO相关优化
SEO是英文Search Engine Optimization的缩写, 中文意译为“搜索引擎优化”. 简单地说, SEO是指从自然搜索结果获得网站流量的技术和过程. http://www.imooc ...
- Python之路,进程、线程、协程篇
本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- 基于 HTML5 WebGL 的低碳工业园区监控系统
前言 低碳工业园区的建设与推广是我国推进工业低碳转型的重要举措,低碳工业园区能源与碳排放管控平台是低碳工业园区建设的关键环节.如何对园区内的企业的能源量进行采集.计量.碳排放核算,如何对能源消耗和碳排 ...
- flock SUSE/RHEL
Util-linux-2.26 Util-linux 软件包其它实用程序.包括处理文件系统.控制台.分区以及消息等工具. 大概编译时间:1.3 SBU 需要磁盘空间:137 MB 6.65.1. FH ...
- k8s 各种网络方案 - 每天5分钟玩转 Docker 容器技术(170)
网络模型有了,如何实现呢? 为了保证网络方案的标准化.扩展性和灵活性,Kubernetes 采用了 Container Networking Interface(CNI)规范. CNI 是由 Core ...
- 关于for循环里面异步操作的问题
首先来看一个比较简单的问题,我们想实现的就是每隔1s输出0-4的值,就是这么简单,看下错误写法: function test() { for (var i = 0; i < 5; ++i) { ...
- Java中的Unsafe类111
1.Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准.但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty.Hadoo ...